Tomek Wójcik
c75ea4ea9d
* `bthlabs-jsonrpc-aiohttp` v1.0.0 * `bthlabs-jsonrpc-core` v1.0.0 * `bthlabs-jsonrpc-django` v1.0.0
54 lines
1.5 KiB
Python
54 lines
1.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
# django-jsonrpc-aiohttp | (c) 2022-present Tomek Wójcik | MIT License
|
|
import typing
|
|
|
|
from aiohttp import web
|
|
|
|
from bthlabs_jsonrpc_aiohttp.executor import AioHttpExecutor
|
|
|
|
|
|
class JSONRPCView:
|
|
"""
|
|
The JSONRPC View. This is the main JSONRPC entry point. Use it to register
|
|
your JSONRPC endpoints.
|
|
|
|
Example:
|
|
|
|
.. code-block:: python
|
|
|
|
from bthlabs_jsonrpc_aiohttp import JSONRPCView
|
|
|
|
app.add_routes([
|
|
web.post('/rpc', JSONRPCView()),
|
|
web.post('/example/rpc', JSONRPCView(namespace='examnple')),
|
|
])
|
|
"""
|
|
|
|
# pragma mark - Public interface
|
|
|
|
def __init__(self, namespace: typing.Optional[str] = None):
|
|
self.namespace: typing.Optional[str] = namespace
|
|
|
|
async def can_call(self,
|
|
request: web.Request,
|
|
method: str,
|
|
args: list,
|
|
kwargs: dict) -> bool:
|
|
"""
|
|
Hook for subclasses to perform additional per-call permissions checks
|
|
etc. The default implementation returns ``True``.
|
|
"""
|
|
return True
|
|
|
|
async def __call__(self, request: web.Request) -> web.Response:
|
|
"""The request handler."""
|
|
executor = AioHttpExecutor(
|
|
request, self.can_call, namespace=self.namespace,
|
|
)
|
|
|
|
serializer = await executor.execute()
|
|
if serializer is None:
|
|
return web.Response(body='')
|
|
|
|
return web.json_response(serializer.data)
|