Simple quickstarter/dispatcher for ASGI apps based on Hypercorn with Request/Response objects from Starlette.
Project description
Cerasus
Cerasus is a simple dispatcher and quickstart function for ASGI apps based on Hypercorn with Request/Response objects from Starlette.
The dispatcher uses a mapping like this:
{
'GET': {
'': webapp.index,
'/': webapp.index,
'/items/get': webapp.api.items.get
},
'POST': {
'/items/add': webapp.api.items.add
}
}
No REST. No Routes. What can be simpler?
The mapping is constructed by expose
decorators. Here's an example that matches the mapping above:
from cerasus import expose, quickstart
from starlette.requests import Request
from starlette.responses import HTMLResponse, JSONResponse
class APIError(Exception):
def __init__(self, status_code, description):
self.status_code = status_code
self.description = description
class Items:
@expose
async def get(self, request):
items = []
# get items
# ...
return JSONResponse(dict(status='success', items=items))
@expose(methods='POST')
async def add(self, request):
item = await request.json()
# add item
# ...
return JSONResponse(dict(status='success'))
class Api:
# Customized error handling for API.
# Error handlers can be either coroutines that return Starlette Response objects, or just objects:
_undefined_method = JSONResponse(dict(status='error', description='Method not allowed'), status_code=405)
_undefined_handler = JSONResponse(dict(status='error', description='Bad endpoint'), status_code=404)
async def _exception_handler(self, request, exc):
return JSONResponse(dict(status='error', description=exc.description), status_code=exc.status_code)
# Note that children "inherit" error responses, i.e. we do not define them for Items
items = Items()
class Webapp:
api = Api()
@expose(name='/')
async def index(self, request):
return HTMLResponse('<h1>Hello</h1>')
async def open_db():
pass
async def close_db():
pass
if __name__ == "__main__":
quickstart(
Api(),
{
'bind': ['127.0.0.1:12345']
'alpn_protocols': ['h2']
},
base_urlpath = '/',
on_startup = open_db,
on_shutdown = close_db
)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
cerasus-0.0.1.tar.gz
(7.2 kB
view details)
Built Distribution
File details
Details for the file cerasus-0.0.1.tar.gz
.
File metadata
- Download URL: cerasus-0.0.1.tar.gz
- Upload date:
- Size: 7.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.10.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2ba0aa9beeef1a675ae9068197f7c9f974fb4ce16d890da9fc2aac818f2fd8bf |
|
MD5 | 5f9f9dfd3e34e5d0761345a4a9f9c942 |
|
BLAKE2b-256 | 1b83851c5b2459abcf86a0c2f6eaf499a26268404f02418b781a25c8a77b0197 |
File details
Details for the file cerasus-0.0.1-py3-none-any.whl
.
File metadata
- Download URL: cerasus-0.0.1-py3-none-any.whl
- Upload date:
- Size: 7.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.10.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d881526a1e4babfc94271c0d1c63f47349b84c94ceead4273cda386bdcaa7be6 |
|
MD5 | 0ef8b483050f7803a9a554bcf3213d7e |
|
BLAKE2b-256 | d0dfd600e247c0803360626d608f16d2dd7f4094ac5d9185d0a1549830e99abc |