前几天写了一篇关于FastApi高级多应用管理蓝图APIRouter的文章。对于一些没有基础的朋友来说可能显得有些迷惑,所以我就按照由浅入深的步骤进行。深序更新,记得关注先看看FastAPI的突出特点,官网如下:Fast:性能非常高,性能媲美NodeJS和Go(感谢Starlette和Pydantic)。现存最快的Python框架之一。快速编码:将功能开发速度提高大约200%到300%*。错误更少:人为错误减少约40%(开发人员)。直观:强大的编辑器支持,更少的程序调试时间。轻松:易于使用和学习,花在阅读文档上的时间更少。简而言之:尽量减少重复代码,每个参数声明中有多个函数,减少编码错误。健壮:获取生产就绪代码。具有自动交互式API文档。基于标准:基于API(并完全兼容)与开放标准:OpenAPI(以前称为Swagger)和JSONSchema。前面提到,FastApi的一大特点是基于标准的Python3.6类型声明,具有参数校验功能。这一切都归功于Pydantic路径参数。path参数为url路径参数。您可以使用与Python格式字符串相同的语法来声明路径。“参数”或“变量”,例如:fromfastapiimportFastAPIapp=FastAPI()@app.get("/items/{item_id}")asyncdefread_item(item_id:int,q:str=None):return{"item":item_id,"q":q}路径参数item_id的值会作为参数传给视图函数,运行命令:uvicorn文件名:app默认端口8000,也可以指定host和端口,--主机=0.0。0.0--port=8008运行后,在浏览器中打开http://127.0.0.1:8000/items/1,可以看到响应:{"item":1,"q":null}其中声明了item_id是int类型,q是可选参数,默认为None,所以响应中的q为None。当我们通过http://127.0.0.1:8000/items/test访问时,可以看到很友好的错误Response{"detail":[{"loc":["path","item_id"],"msg":"valueisnotavalidinteger","type":"type_error.integer"}]}因为路径参数item_id的值为“test”,无法转换为int。这是参与校验查询参数。查询参数也包含在url地址中。它位于网址中吗?接下来的一组键值对,用&字符分隔,爬虫朋友很熟悉,比如下面的请求参数data={"test":1,"name":"Python编程与实战"}response=requests.get(url,params=data)传递的关键字参数params是查询参数,你可以把response.url打印出来看看?下面的键值对参数那么FastApi在服务端是如何接收这样的参数的呢?请查看来自fastapiimportFastAPIapp=FastAPI()fake_items_db=[{"item_name":"Foo"},{"item_name":"Bar"},{"item_name":"Baz"}]@app.get("/items/")asyncdefread_item(skip:int=0,limit:int=10):returnfake_items_db[skip:skip+limit]运行后输入地址:http://127.0.0.1:8000/items/?skip=0&limit=10查询参数为:skip:值为0limit:值为10注意这两个参数有默认值,可以选择onlyPassanoptionalparameter同理,可以通过声明一个可选的查询参数将其默认值设置为NonefromfastapiimportFastAPIapp=FastAPI()@app.get("/items/{item_id}")asyncdefread_item(item_id:str,q:str=None):ifq:return{"item_id":item_id,"q":q}return{"item_id":item_id}必填查询参数上面代码中去掉q:str如果为None,则q成为必填查询参数,即必须传,否则报错会提示{"detail":[{"loc":["query","q"],"msg":"必填字段","type":"value_error.丢失的”}]}总结一下,在实际代码中可能会用到必填参数、默认参数、可选参数,如下:fromfastapiimportFastAPIapp=FastAPI()@app.get("/items/{item_id}")asyncdefread_user_item(item_id:str,needy:str,skip:int=0,limit:int=None):item={"item_id":item_id,"needy":needy,"skip":skip,"limit":limit}返回项目In这种情况下,有3个查询参数:needy是必需的strskip,int默认值为0。limit,可选的int。还有一个路径参数:item_id,str类型请求体参数发送请求文本,必须使用一个:POST,PUT,DELETE或PATCH,需要导入Pydantic的BaseModelfromfastapiimportFastAPIimportuvicornfrompydanticimportBaseModelapp=FastAPI()classCommonItem(BaseModel):token:strmessage_id:strto_id:strfrom_info:strstrategy:intorstr=0#默认为0,可以不传这个参数,但是不能传空字符串type:strorint#str和int类型都支持from_id:strto_info:strcontent:str=None@app.post("/test")asyncdeftests(item:CommonItem):returnitem可以看到,创建了一个CommonItem模型。通过声明的模型,可以实现以下功能:读取JSON中的请求文本根据声明的类型,自动转换参数验证数据,如果数据无效,将返回一个明确的错误,表明接收到参数中错误数据的准确位置和来源同时,FastApi可以自动帮助我们识别请求体参数、路径参数和查询参数,准确获取参数数据。例如下面的代码:fromfastapiimportFastAPIfrompydanticimportBaseModelclassItem(BaseModel):name:strdescription:str=Noneprice:floattax:float=Noneapp=FastAPI()@app.put("/items/{item_id}")asyncdefcreate_item(item_id:int,item:Item,q:str=None):result={"item_id":item_id,**item.dict()}ifq:result.update({"q":q})returnresult以上代码,参数会被自动识别为:item_id,:path参数q:参数为单一类型(如int、float、str、bool等),会被解释作为查询参数项:参数声明为Pydantic模型的类型,它将被解释为请求主体
