个人笔记 code FastAPI mhduiy 2024-10-16 2024-10-16 简介 FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架
官网 https://fastapi.tiangolo.com/zh/
简单示例 1 2 3 4 5 6 7 8 9 10 11 from fastapi import FastAPI import uvicornapp = FastAPI() @app.get("/" ) async def root (): return {"你好!" : "朋友。" } if __name__ == '__main__' : uvicorn.run(app='main:app' , host="127.0.0.1" , port=9999 , reload=True )
运行:
1 2 3 4 python3 ./main.py uvicorn main:app --reload --port 9999
UVicorn UVicorn是一个基于ASGI(Asynchronous Server Gateway Interface)的高性能异步服务器,用于运行Python的Web应用程序。它是由编写了Starlette框架的同一团队开发的,同时也是FastAPI框架的建议服务器。UVicorn旨在提供快速的HTTP请求响应,同时支持异步处理,这使得它成为异步Python web应用程序的理想选择之一
生成api文档 http://127.0.0.1:9999/redoc
路径参数
支持使用python字符串格式化语法声明路径参数 1 2 3 @app.get("/data/{item_id}" ) async def getItemId (item_id ): return {"item_id" :item_id}
支持声明参数的类型
1 2 3 @app.get("/data/{item_id}" ) async def getItemId (item_id: int ): return {"item_id" :item_id}
可创建枚举进行访问 1 2 3 4 5 6 7 8 9 10 11 12 13 class ModelName (str , Enum): alexnet = "alexnet" resnet = "resnet" lenet = "lenet" @app.get("/data/{model_name}" ) async def getModel (model_name: ModelName ): if model_name is ModelName.alexnet: return ModelName.alexnet elif model_name is ModelName.resnet: return ModelName.resnet else : return ModelName.lenet
顺序很重要 解析路径的时候会按代码顺序从上到下解析,在上面的路径优先被解析使用
使用文件路径作为路径参数 1 2 3 4 5 @app.get("/files/{file_path:path}" ) def readFile (file_path ): with open (file_path, 'r' , encoding='utf-8' ) as file: return file.read()
查询参数 声明的参数不是路径参数的时候默认解析为查询参数
查询字符串是键值对的集合,这些键值对位于 URL 的 ? 之后,以 & 分隔 例如
1 http://127.0.0.1:8000/items/?skip=0&limit=10
查询参数为:
可以声明可选的查询参数 1 2 3 4 5 6 7 @app.get("/getTel/" ) async def getData (name: str , sex: str | None = None ): print (name) if name is '张三' : return "123456" else : return {quote("张三" ): name}
请求体和响应体
请求体时客户端项API发送数据 POST,DELETE,PATCH
响应体时API向客户端发送数据【必须】
1 2 3 4 5 6 7 8 9 10 class Item (BaseModel ): name: str description: str | None = None price: float app = FastAPI() @app.post("/item/" ) async def createItem (item: Item ): return {"name" : item.name, "des" : item.description, "price" : item.price}