ASGI应用程序使用请求/响应对象的dataclasses模块

apidaora的Python项目详细描述


阿皮达拉


文档https://dutradda.github.io/apidaora

源代码https://github.com/dutradda/apidaora


主要特点

  • 使用类型注释将请求/响应声明为数据类和dict
  • 使用jsondaora验证输入数据
  • fastestpython api框架之一
  • 可以在任何asgi服务器上运行

要求

  • Python 3.8+
  • jsondaora用于json验证/解析
  • orjson用于json/字节序列化(jsondaora依赖项)

安装

$ pip install apidaora

简单的例子

^{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: 14

"Hello World!"

基本示例

fromtypingimportTypedDictfromjsondaoraimportIntegerField,StringField,jsondaorafromapidaoraimportHeader,appdaora,routeclassInteger(IntegerField,minimum=18):...classString(StringField,max_length=100):...classAge(Header,type=Integer):...@jsondaoraclassYou(TypedDict):name:strlast_name:strlocation:strage:int@jsondaoraclassReqBody(TypedDict):last_name:str@jsondaoraclassHelloOutput(TypedDict):hello_message:strabout_you:You@route.put('/hello/{name}')asyncdefhello_controller(name:str,location:String,age:Age,body:ReqBody)->HelloOutput:you=You(name=name,location=location.value,age=age.value.value,last_name=body['last_name'],)returnHelloOutput(hello_message=awaithello_message(name,location.value),about_you=you)asyncdefhello_message(name:str,location:str)->str:returnf'Hello {name}! Welcome to {location}!'app=appdaora(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-age: 32'\
    -d '{"last_name":"My Self"}'
HTTP/1.1 200 OK
date: Thu, 1st January 1970 00:00:00 GMT
server: uvicorn
content-type: application/json
content-length: 123

{"hello_message":"Hello Me! Welcome to World!","about_you":{"name":"Me","location":"World","age":32,"last_name":"My Self"}}

更多请求/响应详细信息示例

fromhttpimportHTTPStatusfromtypingimportDictfromjsondaoraimportjsondaorafromapidaoraimportBadRequestError,Header,Response,appdaora,json,route# Domain layer, here are the domain related definitions# it is apidaora/framework/http independent@jsondaoraclassYou:name:strlast_name:strage:intDB:Dict[str,You]={}defadd_you(you:You)->None:ifyou.nameinDB:raiseYouAlreadyBeenAddedError(you.name)DB[you.name]=youdefget_you(name:str)->You:try:returnDB[name]exceptKeyError:raiseYouWereNotFoundError(name)classDBError(Exception):@propertydefinfo(self)->Dict[str,str]:return{'name':self.args[0]}classYouAlreadyBeenAddedError(DBError):name='you-already-been-added'classYouWereNotFoundError(DBError):name='you-were-not-found'# Application layer, here are the http related definitions# See: https://dutrdda.github.io/apidaora/tutorial/headers/classReqID(Header,type=str,http_name='http_req_id'):...@route.post('/you/')asyncdefadd_you_controller(req_id:ReqID,body:You)->Response:try:add_you(body)exceptYouAlreadyBeenAddedErroraserror:raiseBadRequestError(name=error.name,info=error.info)fromerrorreturnjson(body,HTTPStatus.CREATED,headers=(req_id,))@route.get('/you/{name}')asyncdefget_you_controller(name:str,req_id:ReqID)->Response:try:returnjson(get_you(name),headers=(req_id,))exceptYouWereNotFoundErroraserror:raiseBadRequestError(name=error.name,info=error.info)fromerrorapp=appdaora([add_you_controller,get_you_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 -X POST -i localhost:8000/you/ -H 'http_req_id: 1a2b3c4d' -d '{"name":"Me","last_name":"Myself","age":32}'
HTTP/1.1 201 Created
date: Thu, 1st January 1970 00:00:00 GMT
server: uvicorn
content-type: application/json
content-length: 43
http_req_id: 1a2b3c4d

{"name":"Me","last_name":"Myself","age":32}

curl -i localhost:8000/you/Me -H 'http_req_id: 4d3c2b1a'
HTTP/1.1 200 OK
date: Thu, 1st January 1970 00:00:00 GMT
server: uvicorn
content-type: application/json
content-length: 43
http_req_id: 4d3c2b1a

{"name":"Me","last_name":"Myself","age":32}

基准

techempower benchmark

完整的结果可以找到here

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用Eclipse Helios for Web项目   java指定行。作为编译器设置的分隔符?   osm映射中带有osmdroid的java标记   java Android ClassNotFoundException在路径:DexPathList上未找到类   java从j2me调用GWT方法   更新到java 8后的aspectj问题   如何仅从根元素java,com提取文本内容。滴虫软件。是的。html   安卓公司。谷歌。火基。数据库DatabaseException:未能转换java类型的值。将字符串改为长字符串   从java中的方法返回arraylist变量   java如果将引用重新分配给同步块内的锁对象,会是什么?   java下载。使用spring mvc的资源文件中的xlsx文件   java Eclipse提供了什么工具来运行Eclipse中未包含的程序?   spring boot Java泛型如何读取传递给泛型方法的类型上的字段或调用方法   Javacard中的javaecdsa签名