JSON-RPC implementation for Django's channels library.
Project description
channels-rpc
`channels-rpc`` is aimed to enable JSON-RPC functionnality on top of the excellent django channels project and especially their Websockets functionality. It is aimed to be:
- Fully integrated with Channels
- Fully implement JSON-RPC 1 and 2 protocol
- Support both WebSocket and HTTP transports
- Easy integration
Installation
$ pip install git+ssh://git@github.com/quantivly/channels-rpc.git
Use
It is intended to be used as a WebSocket consumer:
from channels_rpc import JsonRpcWebsocketConsumer
class MyJsonRpcConsumer(JsonRpcConsumer):
def connect(self, message, **kwargs):
"""Perform things on WebSocket connection start"""
self.accept()
print("connect")
# Do stuff if needed
def disconnect(self, message, **kwargs):
"""Perform things on WebSocket connection close"""
print("disconnect")
# Do stuff if needed
JsonRpcWebsocketConsumer derives from channels
JsonWebsocketConsumer.
Then, the last step is to create the RPC methos hooks using the rpc_method
decorator:
@MyJsonRpcConsumer.rpc_method()
def ping():
return "pong"
Or, with a custom name:
@MyJsonRpcConsumer.rpc_method("mymodule.rpc.ping")
def ping():
return "pong"
Will now be callable with "method":"mymodule.rpc.ping" in the rpc call:
{
"id":1,
"jsonrpc":"2.0",
"method":"mymodule.rpc.ping",
"params":{}
}
RPC methods can obviously accept parameters. They also return "results" or "errors":
@MyJsonRpcConsumer.rpc_method("mymodule.rpc.ping")
def ping(fake_an_error):
if fake_an_error:
# Will return an error to the client
# --> {"id":1, "jsonrpc":"2.0","method":"mymodule.rpc.ping","params":{}} # <-- {"id": 1, "jsonrpc": "2.0", "error": {"message": "fake_error", "code": -32000, "data": ["fake_error"]}} raise Exception("fake_error")
else:
# Will return a result to the client
# --> {"id":1, "jsonrpc":"2.0","method":"mymodule.rpc.ping","params":{}} # <-- {"id": 1, "jsonrpc": "2.0", "result": "pong"} return "pong"
Async Use
Simply derive your customer from an asynchronous customer like
AsyncJsonRpcWebsocketConsumer:
from channels_rpc import AsyncJsonRpcWebsocketConsumer
class MyAsyncJsonRpcConsumer(AsyncJsonRpcWebsocketConsumer):
pass
@MyAsyncJsonRpcConsumer.rpc_method("mymodule.rpc.ping")
async def ping(fake_an_error):
return "ping"
Sessions and other parameters from Consumer object
The original channel message - that can contain sessions (if activated with
http_user)
and other important info can be easily accessed by retrieving the **kwargs
and get a parameter named consumer.
MyJsonRpcConsumerTest.rpc_method()
def json_rpc_method(param1, **kwargs):
consumer = kwargs["consumer"]
##do something with consumer
Example:
class MyJsonRpcConsumerTest(JsonRpcConsumer):
# Set to True to automatically port users from HTTP cookies
# (you don't need channel_session_user, this implies it) # https://channels.readthedocs.io/en/stable/generics.html#websockets http_user = True
....
@MyJsonRpcConsumerTest.rpc_method()
def ping(**kwargs):
consumer = kwargs["consumer"]
consumer.scope["session"]["test"] = True
return "pong"
Testing
The JsonRpcConsumer class can be tested the same way Channels Consumers are tested. See here
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file channels_rpc-0.2.0.tar.gz.
File metadata
- Download URL: channels_rpc-0.2.0.tar.gz
- Upload date:
- Size: 9.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.3 CPython/3.10.6 Linux/6.5.0-1024-aws
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
25b874d565ab9aa22eec769d55f7f7bb2ab65324d9425598955a471faef928cb
|
|
| MD5 |
b5cf383b3c1b5247773f99308730dfce
|
|
| BLAKE2b-256 |
85bd6af003ef19c2f15a7b790668321cbf8fe13658115345d6460f8d120a4f4b
|
File details
Details for the file channels_rpc-0.2.0-py3-none-any.whl.
File metadata
- Download URL: channels_rpc-0.2.0-py3-none-any.whl
- Upload date:
- Size: 12.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.3 CPython/3.10.6 Linux/6.5.0-1024-aws
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e0ca35ef2a718084f1564823c18c65ceccce6a1d98f9ee5b9c5ef3444885a399
|
|
| MD5 |
82ee2f039f3b7285ee65f57f4c21be23
|
|
| BLAKE2b-256 |
94e5f883410880c0be72a283150ea447f9bb5bedbe0da2c6c957e6687654539e
|