为请求/响应对象使用dataclasses模块的ASGI应用程序
dataclassesapi的Python项目详细描述
数据类API
{str}文档{str}
源代码:https://github.com/dutradda/dataclassesapi
主要特点
- 在
将请求对象声明为@dataclass:
- ^{path>
Query
查询字符串上的值Headers
获取标题上的值Body
表示主体上的值
- ^{path>
- 在
将响应对象声明为@dataclass:
Headers
获取标题上的值Body
表示主体上的值
要求
- Python 3.7+
- dataclassesjson用于json验证/解析
- orjson用于json/bytes序列化
安装
$ pip install dataclassesapi
基本示例
^{pr2}$运行服务器(需要uvicorninstalled):
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)
查询服务器(需要curlinstalled):
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!"}
完整请求/响应示例
fromdataclassesimportdataclassfromhttpimportHTTPStatusfromdataclassesjsonimportdataclassjson,integer,stringfromdataclassesapiimportMethodType,Route,asgi_appfromdataclassesapi.requestimportBody,Headers,PathArgs,Query,Requestfromdataclassesapi.responseimportBodyasResponseBodyfromdataclassesapi.responseimportResponse@dataclassclassMyPathArgs(PathArgs):name:str@dataclassclassMyQuery(Query):location:str@dataclassclassMyHeaders(Headers):x_req_id:str@dataclassclassMyBody(Body):last_name:strage:int@dataclassclassMyRequest(Request):path_args:MyPathArgsquery:MyQueryheaders:MyHeadersbody:MyBody@dataclassclassYou:name:strlast_name:strlocation:string(max_length=100)age:integer(minimum=18)@dataclassclassMyResponseBody(ResponseBody):hello_message:strabout_you:You@dataclassjson@dataclassclassMyResponse(Response):body:MyResponseBodyheaders:MyHeadersdefhello_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)returnMyResponse(HTTPStatus.OK,body=body,headers=headers)defhello_message(name:str,location:str)->str:returnf'Hello {name}! Welcome to {location}!'app=asgi_app([Route('/hello/{name}',MethodType.PUT,hello_controller)])
运行服务器:
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)
查询服务器:
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}}
- 项目
标签: