import uuid from aiohttp import web import pjrpc.server from pjrpc.server.integration import aiohttp methods = pjrpc.server.MethodRegistry() @methods.add(context='request') async def add_user(request: web.Request, user: dict): user_id = uuid.uuid4().hex request.app['users'][user_id] = user return {'id': user_id, **user} jsonrpc_app = aiohttp.Application('/api/v1') jsonrpc_app.dispatcher.add_methods(methods) jsonrpc_app.app['users'] = {} if __name__ == "__main__": web.run_app(jsonrpc_app.app, host='localhost', port=8080)
) -> pjrpc.exceptions.JsonRpcError: method_error_count.labels(method=request.method, code=error.code).inc() return error async def validation_error_handler( request: pjrpc.Request, context: web.Request, error: pjrpc.exceptions.JsonRpcError, ) -> pjrpc.exceptions.JsonRpcError: print("validation error occurred") return error jsonrpc_app = aiohttp.Application( '/api/v1', app=http_app, middlewares=( latency_metric_middleware, active_count_metric_middleware, ), error_handlers={ -32602: [validation_error_handler], None: [any_error_handler], }, ) jsonrpc_app.dispatcher.add_methods(methods) if __name__ == "__main__": web.run_app(jsonrpc_app.app, host='localhost', port=8080)
from aiohttp import web import pjrpc.server from pjrpc.server.integration import aiohttp methods = pjrpc.server.MethodRegistry() @methods.add(context='request') async def method(request): print("method") async def sentry_middleware(request, context, handler): try: return await handler(request, context) except pjrpc.exceptions.JsonRpcError as e: sentry_sdk.capture_exception(e) raise jsonrpc_app = aiohttp.Application( '/api/v1', middlewares=( sentry_middleware, ), ) jsonrpc_app.dispatcher.add_methods(methods) if __name__ == "__main__": web.run_app(jsonrpc_app.app, host='localhost', port=8080)
return PostOut(id=post_id, **post.dict()) jsonrpc_app = integration.Application( '/api/v1', json_encoder=JSONEncoder, spec=specs.OpenAPI( info=specs.Info(version="1.0.0", title="User storage"), servers=[ specs.Server(url='http://127.0.0.1:8080', ), ], security_schemes=dict(basicAuth=specs.SecurityScheme( type=specs.SecuritySchemeType.HTTP, scheme='basic', ), ), security=[ dict(basicAuth=[]), ], schema_extractors=[ extractors.docstring.DocstringSchemaExtractor(), extractors.pydantic.PydanticSchemaExtractor(), ], ui=specs.SwaggerUI(), # ui=specs.RapiDoc(), # ui=specs.ReDoc(), ), ) jsonrpc_app.app['users'] = {} jsonrpc_app.app['posts'] = {}
print("method") async def middleware1(request, context, handler): print("middleware1 started") result = await handler(request, context) print("middleware1 finished") return result async def middleware2(request, context, handler): print("middleware2 started") result = await handler(request, context) print("middleware2 finished") return result jsonrpc_app = aiohttp.Application( '/api/v1', middlewares=( middleware1, middleware2, ), ) jsonrpc_app.dispatcher.add_methods(methods) if __name__ == "__main__": web.run_app(jsonrpc_app.app, host='localhost', port=8080)
def json_rpc(path): json_rpc = integration.Application(path) return json_rpc
tracer = opentracing.global_tracer() span = tracer.start_span(f'jsonrpc.{request.method}') span.set_tag(tags.COMPONENT, 'pjrpc') span.set_tag(tags.SPAN_KIND, tags.SPAN_KIND_RPC_SERVER) span.set_tag('jsonrpc.version', request.version) span.set_tag('jsonrpc.id', request.id) span.set_tag('jsonrpc.method', request.method) with tracer.scope_manager.activate(span, finish_on_close=True): response = await handler(request, context) if response.is_error: span.set_tag('jsonrpc.error_code', response.error.code) span.set_tag('jsonrpc.error_message', response.error.message) span.set_tag(tags.ERROR, True) else: span.set_tag(tags.ERROR, False) return response jsonrpc_app = aiohttp.Application( '/api/v1', app=http_app, middlewares=(jsonrpc_tracing_middleware, ), ) jsonrpc_app.dispatcher.add_methods(methods) if __name__ == "__main__": web.run_app(jsonrpc_app.app, host='localhost', port=8080)
def jsonrpc_app(http_app): jsonrpc_app = integration.Application('/api/v1', app=http_app) jsonrpc_app.dispatcher.add_methods(methods) return jsonrpc_app
surname: str age: int contacts: List[Contact] @methods.add(context='request') @validator.validate async def add_user(request: web.Request, user: User): user_id = uuid.uuid4() request.app['users'][user_id] = user return {'id': user_id, **user.dict()} class JSONEncoder(pjrpc.server.JSONEncoder): def default(self, o): if isinstance(o, uuid.UUID): return o.hex if isinstance(o, enum.Enum): return o.value return super().default(o) jsonrpc_app = aiohttp.Application('/api/v1', json_encoder=JSONEncoder) jsonrpc_app.dispatcher.add_methods(methods) jsonrpc_app.app['users'] = {} if __name__ == "__main__": web.run_app(jsonrpc_app.app, host='localhost', port=8080)
user_id = uuid.uuid4().hex request.config_dict['users'][user_id] = user return {'id': user_id, **user} methods_v2 = pjrpc.server.MethodRegistry() @methods_v2.add(context='request') async def add_user_v2(request: web.Request, user: dict): user_id = uuid.uuid4().hex request.config_dict['users'][user_id] = user return {'id': user_id, **user} app = web.Application() app['users'] = {} app_v1 = aiohttp.Application() app_v1.dispatcher.add_methods(methods_v1) app.add_subapp('/api/v1', app_v1.app) app_v2 = aiohttp.Application() app_v2.dispatcher.add_methods(methods_v2) app.add_subapp('/api/v2', app_v2.app) if __name__ == "__main__": web.run_app(app, host='localhost', port=8080)