ASGI App using dataclasses module for request/response objects
Project description
dataclassesapi
Asgi App using typing annotation
Documentation: https://dutradda.github.io/dataclassesapi
Source Code: https://github.com/dutradda/dataclassesapi
Key Features
-
Declare request object as @dataclass:
PathArgs
for values on pathQuery
for values on query stringHeaders
for values on headersBody
for values on body
-
Declare response object as @dataclass:
Headers
for values on headersBody
for values on body
Requirements
- Python 3.7+
- dataclassesjson for json validation/parsing
- orjson for json/bytes serialization
Instalation
$ pip install dataclassesapi
Basic example
from dataclasses import dataclass from http import HTTPStatus from dataclassesjson import dataclassjson from dataclassesapi import MethodType, Route, asgi_app from dataclassesapi.request import Query, Request from dataclassesapi.response import Body as ResponseBody from dataclassesapi.response import Response @dataclass class MyQuery(Query): name: str @dataclass class MyRequest(Request): query: MyQuery @dataclass class MyResponseBody(ResponseBody): message: str @dataclassjson @dataclass class MyResponse(Response): body: MyResponseBody def hello_controller(req: MyRequest) -> MyResponse: name = req.query.name body = MyResponseBody(message=f'Hello {name}!') return MyResponse(HTTPStatus.OK, body=body) app = asgi_app([Route('/hello', MethodType.GET, hello_controller)])
Running the server (needs uvicorn installed):
uvicorn myapp:app
INFO: Started server process [16220]
INFO: Waiting for application startup.
INFO: ASGI 'lifespan' protocol appears unsupported.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
Quering the server (needs curl installed):
curl -i localhost:8000/hello?name=World
HTTP/1.1 200 OK
date: Thu, 1st January 1970 00:00:00 GMT
server: uvicorn
content-type: application/json
content-length: 26
{"message":"Hello World!"}
Example for complete request/response
from dataclasses import dataclass from http import HTTPStatus from dataclassesjson import dataclassjson, integer, string from dataclassesapi import MethodType, Route, asgi_app from dataclassesapi.request import Body, Headers, PathArgs, Query, Request from dataclassesapi.response import Body as ResponseBody from dataclassesapi.response import Response @dataclass class MyPathArgs(PathArgs): name: str @dataclass class MyQuery(Query): location: str @dataclass class MyHeaders(Headers): x_req_id: str @dataclass class MyBody(Body): last_name: str age: int @dataclass class MyRequest(Request): path_args: MyPathArgs query: MyQuery headers: MyHeaders body: MyBody @dataclass class You: name: str last_name: str location: string(max_length=100) age: integer(minimum=18) @dataclass class MyResponseBody(ResponseBody): hello_message: str about_you: You @dataclassjson @dataclass class MyResponse(Response): body: MyResponseBody headers: MyHeaders def hello_controller(req: MyRequest) -> MyResponse: body = MyResponseBody( hello_message=hello_message(req.path_args.name, req.query.location), about_you=You( name=req.path_args.name, last_name=req.body.last_name, location=req.query.location, age=req.body.age, ), ) headers = MyHeaders(x_req_id=req.headers.x_req_id) return MyResponse(HTTPStatus.OK, body=body, headers=headers) def hello_message(name: str, location: str) -> str: return f'Hello {name}! Welcome to {location}!' app = asgi_app([Route('/hello/{name}', MethodType.PUT, hello_controller)])
Running the server:
uvicorn myapp:app
INFO: Started server process [16220]
INFO: Waiting for application startup.
INFO: ASGI 'lifespan' protocol appears unsupported.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
Quering the server:
curl -i -X PUT localhost:8000/hello/Me?location=World \ -H 'x-req-id: 1a2b3c4d5e6f7g8h' \ -d '{"last_name":"My Self","age":32}'
HTTP/1.1 200 OK
date: Thu, 1st January 1970 00:00:00 GMT
server: uvicorn
x-req-id: 1a2b3c4d5e6f7g8h
content-type: application/json
content-length: 123
{"hello_message":"Hello Me! Welcome to World!","about_you":{"name":"Me","last_name":"My Self","location":"World","age":32}}
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
dataclassesapi-0.2.0.tar.gz
(23.5 kB
view hashes)
Built Distribution
Close
Hashes for dataclassesapi-0.2.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 03148da85c78b7be32bd43308c0383740013fb8fa9cf2de77801ed60165fc685 |
|
MD5 | 0ed765136ecf9aef0641e7ca8544da9d |
|
BLAKE2-256 | a42a79eef2e3f88de83cf1eaaf04f61785d6b48e6d93e3ef0d39d0f37c5025d2 |