前言
当我第一次看到Python + FastAPI这个组合的时候,瞬间就来了兴趣(为什么有兴趣,可以看文末FastAPI亮点章节),所以果断的踏上了“长脑子”的道路,天选打工人们,一起开始折腾吧~
正文
一、安装FastAPI
由于FastAPI本身不支持ASGI服务,所以需要结合Uvicor这类的ASGI框架进行配套使用,所以至少安装FastAPI以及Uvicor两个模块。
pip install fastapi uvicor
二、启动服务
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/")
def home():
return {"Hello":"World1"}
if __name__ == '__main__':
uvicorn.run(app)
按照上述方式编写代码后运行,就可以通过 http://127.0.0.1:8000 方式访问了。
三、部分常用配置
3.1访问地址配置
默认启动服务后,访问站点只能通过localhost或者127.0.0.1进行访问,如果想通过本地(服务器)ip进行访问,需要设置启动服务的参数,增加host配置,具体配置如下:
uvicorn.run("main:app", host="0.0.0.0")
3.2 端口配置
uvicorn服务默认端口为8000,如果要自定义,可以在启动服务时增加port参数配置:
uvicorn.run("main:app", host="0.0.0.0", port=5000)
3.2 热加载
uvicorn服务默认热加载服务是关闭的,如果要打开,可以在启动服务时增加reload参数配置:
uvicorn.run("main:app", host="0.0.0.0", port=5000, reload=True)
注:
1、不知道是uvicorn版本问题还是新版Pycharm的问题,热加载服务响应非常的慢,有时甚至不会生效,遇到这种情况时可以使用uvicorn的0.21.0版本即可。
2、这里的热加载监测为项目工程文件,如果想指定某一目录热加载生效,可以配套watchgod服务进行使用。
3.3 watchgod服务安装使用(无需指定热加载目录,可跳过)
3.3.1 安装watchgod
pip install watchgod
3.3.2 watchgod使用
在启动服务时指定reload_dirs参数可以指定热加载生效的目录,其余目录热加载将不再生效,具体配置如下:
uvicorn.run("main:app", host="0.0.0.0", port=5000, reload=True, reload_dirs="src")
四、路由使用
4.1 定义路由
FastAPI提供了多种路由装饰器来定义响应HTTP以及Websocket事件,包括:
@app.get(): 处理 HTTP GET 请求。@app.post(): 处理 HTTP POST 请求。@app.put(): 处理 HTTP PUT 请求。@app.delete(): 处理 HTTP DELETE 请求。@app.options(): 处理 HTTP OPTIONS 请求。@app.patch(): 处理 HTTP PATCH 请求。@app.head(): 处理 HTTP HEAD 请求。@app.trace(): 处理 HTTP TRACE 请求。@app.connect(): 处理 WebSocket 连接。@app.websocket(): 处理 WebSocket 事件。
使用示例:
@app.get("/")
def home():
"""
get路由使用示例
:return:
"""
return {"Hello": "World"}
@app.post("/login")
def login():
"""
pot路由使用示例
:return:
"""
return {"code": 200}
@app.put("/items/{item_id}")
async def update_item(item_id: int):
"""
put路由使用示例
:param item_id:
:return:
"""
return {"item_id": item_id}
@app.delete("/del/items/{item_id}")
async def delete_item(item_id: int):
"""
delete路由使用示例
:param item_id:
:return:
"""
return {"item_id": item_id}
......more
4.2 路由参数
在 FastAPI 中路由参数包括路径参数、查询参数以及请求参数几大类。
路径参数
路径参数用于从 URL 路径中提取值。它们通常用于标识资源。在API开发过程中常用于传递标识符,接收方通过获取路径参数就可以直接处理目标业务了。
@app.get("/item/{item_id}")
def getItem(item_id: int):
return {"item_id": item_id}
查询参数
查询参数用于从 URL 的查询字符串中提取值。它们通常用于过滤或排序数据。相比上述路径参数而言,不会将路由地址进行固化,相对灵活!以下示例中的item_id是可以不用传递的,也可以直接拼接在路由路劲中直接访问:
@app.get("/item")
def getItem2(item_id: int = None):
return {"item_id": item_id}
请求体 请求体参数这里以json数据格式为例,将json数据作为请求体发起请求:
class Item(BaseModel):
id: int
name: str
@app.put("/create/item")
def create_item(item: Item):
return item
四、FastAPI亮点
使用FastAPI我个人喜欢的最直接的两个优势就是自动序列化和自动生成API文档。
自动序列化
FastAPI可以将返回的任何字典dict数据进行序列化,无需再像Flask那样使用jsonify进行序列化了。就算是复杂的数据结构,只要使用Pydantic进行定义,也可以完成自动化(如上述请求体一样)。
自动生成API文档
默认情况下FastAPI 支持 OpenAPI 以及 Swagger UI 和 ReDoc。这意味着会自动记录生成我们的API文档,我们无需额外操作就可以查看我们定义的所有API信息。查看方式如下:
// 访问openapi类型文档
http://127.0.0.1:5000/openapi.json
// 访问Swagger UI类型文档
http://127.0.0.1:5000/docs
// 访问ReDoc类型文档
http://127.0.0.1:5000/redoc
结束
好像是“长了点脑子”,你呢?