Skip to main content

Turn Quart into a simple RPC server

Project description

📢 Quart-RPC

pip install quart-rpc

🚨Seeking contributions to bring more RPC protocols to Quart-RPC.

The Quart implementation of Flask-RPC

Quart-RPC currently only uses the weeRPC as its protocol, which is a micro JSON-based protocol that allows for easy communication between the client and server.

This extension is designed to stay slim and provides methods for generating requests and responses.

It does not enforce or validate the data passed in, or the data being sent back; this is left to you to implement in whatever way you feel comfortable (or not at all, if there's no need for it)

Quart-RPC does validate the version of weeRPC on an incoming request. This is to ensure that the request is structured in a way that the version of RPC you are using expects.

Other than that, you are free to use whatever data validation you feel comfortable with. Pydantic and Marshmallow are good choices.

The typical request/response cycle is as follows:

Request

{
  "weerpc": 1.1,
  "function": "add_numbers",
  "data": [
    1,
    2,
    3
  ]
}

Response

{
  "weerpc": 1.1,
  "ok": true,
  "message": "Function 'add_numbers' executed successfully",
  "data": 6
}

Usage

This repo contains a working example of Quart-RPC.

It also includes an example of using the JS library that helps in making requests via fetch to Quart-RPC.

Simplest example

from quart import Quart

from quart_rpc.latest import RPC, RPCResponse


def add_numbers(data):
    if isinstance(data, list):
        return RPCResponse.success(
            sum(data),
            "Function 'add_numbers' executed successfully"
        )


app = Quart(__name__)
rpc = RPC(app, url_prefix="/rpc")  # or blueprint
rpc.functions(
    add_numbers=add_numbers
)

or

...
RPC(
    app,   # or blueprint
    url_prefix="/rpc", 
    functions={
        "add_numbers": add_numbers
    }
)
...

RPC(...)

Will register a POST route with the app or blueprint that you pass in.

rpc.functions(...)

Will register the functions that you pass in to be called remotely. The argument names used will be the name of the function you will call remotely, for example:

rpc.functions(
    add_numbers=add_numbers,
    subtract=subtract_numbers
)

Calling subtract remotely will call the subtract_numbers function.

A request to the /rpc endpoint with the following JSON payload:

import requests
from quart_rpc import RPCRequest

response = requests.post(
    "http://localhost:5000/rpc",
    json=RPCRequest.build(
        function="add_numbers",
        data=[1, 2, 3]
    )
)

or, if you're using the JS library:

fetch("/rpc", {
    method: "POST",
    headers: {
        "Content-Type": "application/json"
    },
    body: wrpc(
        function_ = "add_numbers",
        data = [1, 2, 3]
    )
})

Will return:

{
  "wrpc": 1.0,
  "ok": true,
  "message": "Function 'add_numbers' executed successfully",
  "data": 6
}

Security

You can lock down RPC routes by using sessions and, or host checking.

Global Session Auth

This will check the Quart session for a key value pair, this will apply this check to every function registered.

from quart_rpc.latest import RPCAuthSessionKey
...
RPC(
    app,  # or blueprint
    url_prefix="/rpc",
    session_auth=RPCAuthSessionKey("logged_in", [True]),
    functions={
        "add_numbers": add_numbers
    }
)
...

or a list of RPCAuthSessionKey:

...
RPC(
    app,  # or blueprint
    url_prefix="/rpc",
    session_auth=[
        RPCAuthSessionKey("logged_in", [True]),
        RPCAuthSessionKey("user_type", ["admin"])
    ],
    functions={
        "add_numbers": add_numbers
    }
)
...

Global Host Auth

In the following example, only requests from 127.0.0.1:5000 will be accepted.

This will apply this check to all functions registered.

...
RPC(
    app,  # or blueprint
    url_prefix="/rpc",
    host_auth=["127.0.0.1:5000"],
    functions={
        "add_numbers": add_numbers
    }
)
...

Scoped Session Auth

This will check the Quart session for a key value pair, but only in the specified functions being registered.

from quart_rpc.latest import RPCAuthSessionKey
...
rpc = RPC(
    app,  # or blueprint
    url_prefix="/rpc",
)
rpc.functions(
    session_auth__=RPCAuthSessionKey("logged_in", [True]),
    add_numbers=add_numbers
)
...

Like the example above, you can also pass a list of RPCAuthSessionKey.

...
rpc.functions(
    session_auth__=[
        RPCAuthSessionKey("logged_in", [True]),
        RPCAuthSessionKey("user_type", ["admin"])
    ],
    add_numbers=add_numbers
)
...

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

quart_rpc-1.6.3.tar.gz (12.1 kB view details)

Uploaded Source

Built Distribution

quart_rpc-1.6.3-py2.py3-none-any.whl (14.4 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file quart_rpc-1.6.3.tar.gz.

File metadata

  • Download URL: quart_rpc-1.6.3.tar.gz
  • Upload date:
  • Size: 12.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.31.0

File hashes

Hashes for quart_rpc-1.6.3.tar.gz
Algorithm Hash digest
SHA256 3c0490d3742dcae14b2f689dbe8644e9a7199bbff00b5aff14bf7a806dc412c4
MD5 e86f2b1f4009c1f767130b97526dd137
BLAKE2b-256 c89c288a0ff3a1d2c8ad8276da54966633d6de85c1a4f7e4b0c48b040810ca75

See more details on using hashes here.

File details

Details for the file quart_rpc-1.6.3-py2.py3-none-any.whl.

File metadata

  • Download URL: quart_rpc-1.6.3-py2.py3-none-any.whl
  • Upload date:
  • Size: 14.4 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.31.0

File hashes

Hashes for quart_rpc-1.6.3-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 6605480ff0dbe747d3b70588e3d73db133e6f897132ed447dca3e2cfd4c90289
MD5 27762017ee7709c6b1f71588d7c37ef3
BLAKE2b-256 cbfd2c85b087530d8c65377c1778fcb1f7fbe545be4b11baf79b75e732ce72ad

See more details on using hashes here.

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