Skip to main content

Module for simple RPC service implementation

Project description

drakaina

Drakaina{width=200px height=205px}

image image image Ruff Code style: black libera manifesto

❗ WIP

Module for simple RPC service implementation

Quickstart

Drakaina may be installed via pip and requires Python 3.7 or higher :

pip install drakaina

A minimal Drakaina example is:

import asyncio
from drakaina import remote_procedure
from drakaina.asgi import ASGIHandler
from drakaina.wsgi import WSGIHandler


@remote_procedure
def my_method():
    return "Hello Bro! ✋️"


@remote_procedure(name="something.get")
def get_some_string():
    return "You called `something.get`."


@remote_procedure(provide_request=True)
def do_something_with_environ(request):
    return f"You called `do_something_with_environ`. Request: {request}."


@remote_procedure()
def tell_the_middleware_something():
    return "You called `tell_the_middleware_something`. It has a some extra conditions."


async def asynchronous_procedure():
    await asyncio.sleep(5)
    return "Ding-Dong 🔔!"


"""
>>> JsonRPCv2().handle({"jsonrpc": "2.0", "method": "my_method", "id": 1})
or define WSGI application
"""
app = WSGIHandler(route="/jrpc")
"""
or define ASGI application
"""
app2 = ASGIHandler(route="/ajrpc")

Drakaina may be ran with any WSGI-compliant server, such as Gunicorn.

gunicorn main:app

or ran with any ASGI-compliant server

uvicorn main:app2

Features

  • WSGI protocol implementation
    • Implemented CORS middleware
    • Compatible with simple middlewares for others wsgi-frameworks, like as Werkzeug, Flask

Documentation

Installation

pip install drakaina

Optional requirements

pip install drakaina[jwt, orjson, ujson]

Define remote procedures

Middlewares

Logging

CORS

JWT

Drakaina may be installed via pip and requires Python 3.7 or higher :

pip install drakaina[jwt]

A minimal Drakaina example is:

from functools import partial
from drakaina import ENV_IS_AUTHENTICATED
from drakaina import ENV_USER_ID
from drakaina import remote_procedure
from drakaina.contrib.jwt import check_permissions
from drakaina.contrib.jwt import login_required
from drakaina.contrib.jwt import match_any
from drakaina.contrib.jwt.utils import encode
from drakaina.contrib.jwt.middleware import JWTAuthenticationMiddleware
from drakaina.wsgi import WSGIHandler


@login_required
@remote_procedure(provide_request=True)
def my_method(request):
    assert request[ENV_IS_AUTHENTICATED]
    return f"Hello Bro ✋! Your ID={request[ENV_USER_ID]}"


@check_permissions(
    scopes=["user_read", "app/user:admin", "username:johndoe"],
    comparison=match_any,
)
@remote_procedure
def my_method():
    return "Hello Bro! ✋️"


async def get_token(request):
    return encode(
        {"username": "johndoe", "scopes": ["username:johndoe"]},
        # sharable_secret,
    )


app = WSGIHandler(
    middlewares=[
        partial(
            JWTAuthenticationMiddleware,
            secret_phrase="_secret_",
            credentials_required=True,
            auth_scheme="Bearer",
            token_getter=get_token,
        )
    ]
)

Using with Django

Create file rpc_views.py in your django application. Define function and wrap it remote_procedure decorator:

from drakaina import remote_procedure

@remote_procedure
def my_method(test: str):
    return "Hello, Django Bro! ✋"

Add JsonRPCView class to urlpatterns. The as_view method must accept the autodiscover argument as the name of the remote procedure files.

from django.urls import path
from drakaina.contrib.django.views import JsonRPCView

urlpatterns = [
    path("api/", JsonRPCView.as_view(autodiscover="rpc_views")),
]

JWT Authentication in your Django project

  1. Add jsonrpc.django module in INSTALLED_APPS list in the settings.py file.
  2. Define JSONRPC_SIGNING_KEY = "Some_Secret_String" in the settings.py file
  3. Use token, token.refresh and token.verify JsonRPC methods for authentication by JWT tokens.

ToDo

  • More tests
  • GZip middleware
  • asgi implementation
  • async middlewares implementation
  • preload or server example
  • implement cysimdjson serializer
  • implement pickle serializer

Credits

This module inspired by official auth0/express-jwt middleware and express-jwt-permissions extension.

License

Apache License 2.0

Artwork

"drakaina.png" by Korolko Anastasia is licensed under License Creative Commons (CC BY-SA 4.0).

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

drakaina-0.5.0.tar.gz (46.9 kB view hashes)

Uploaded Source

Built Distribution

drakaina-0.5.0-py3-none-any.whl (56.5 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page