FastAPI 是一个快速的Web框架,用于构建 API。
-
官方文档:FastAPI - FastAPI
1. FastAPI 主要特点
-
高性能: FastAPI 使用 Starlette 作为其底层 Web 框架,并利用 Pydantic 进行数据验证和序列化。基于 Starlette 和 Pydantic 的高性能,FastAPI 在处理请求和响应时速度非常快。
-
基于类型提示: FastAPI 完全利用 Python 的类型提示(Type Hinting)功能,API 设计更加直观且易于维护。
-
自动生成文档: FastAPI 自动生成 Swagger UI 和 ReDoc 文档界面,可以快速测试和了解 API 功能。
-
支持异步编程: FastAPI 原生支持异步编程,可以使用
async
和await
关键字编写异步代码。 -
依赖注入: FastAPI 提供了一个强大的依赖注入系统,可以定义和管理依赖关系,简化了应用程序的开发和测试过程。
-
高效的请求和响应处理: 通过 Pydantic 模型进行请求体和响应体的验证和序列化,FastAPI 提供了高效的数据处理能力,确保 API 接收和返回的数据符合预期。
2. FastAPI 基本用法
安装依赖:
pip3 install fastapi
pip3 install "uvicorn[standard]"
简单的 FastAPI 应用程序示例:
from fastapi import FastAPI
from pydantic import BaseModel
# 创建 FastAPI 实例
app = FastAPI()
# 定义数据模型
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
# 定义路由
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.post("/items/")
def create_item(item: Item):
return {"item": item}
启动 FastAPI 应用:
# 使用 Uvicorn 或其他 ASGI 服务器来启动
$ uvicorn main:app --reload
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [28720]
INFO: Started server process [28722]
INFO: Waiting for application startup.
INFO: Application startup complete.
其中,main
是 Python 文件名(不包括 .py
后缀),app
是 FastAPI 实例的名称,--reload
使得代码变动时自动重载服务器。
3. 请求 FastAPI 服务器
这里写一个简单的FastAPI 应用脚本:
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
然后,启动这个 FastAPI 应用:
uvicorn main:app --reload
在 FastAPI 应用运行的情况下,可以用 requests
库从另一个 Python 脚本发送请求:
requests
是一个 Python 库,用于简化 HTTP 请求的处理,能够以简单的方式发送 HTTP 请求,并处理响应,可以用 pip 安装。
# 发送 GET 请求
import requests
# 假设 FastAPI 应用运行在 http://localhost:8000
url = "http://localhost:8000/items/42?q=test"
response = requests.get(url)
print("Status Code:", response.status_code) # 返回 HTTP 响应的状态码(例如 200 表示成功)
print("Response JSON:", response.json()) # 返回响应内容
# 如果FastAPI应用有一个POST端点,发送 POST 请求
import requests
url = "http://localhost:8000/items"
data = {"item_id": 42, "q": "test"}
response = requests.post(url, json=data)
print("Status Code:", response.status_code)
print("Response JSON:", response.json()) # 以 JSON 格式获取响应内容
# 如果需要添加请求头或者查询参数
import requests
# 添加请求头
# headers:一个字典,包含要添加的请求头信息
headers = {'Authorization': 'Bearer YOUR_TOKEN'}
response = requests.get("http://localhost:8000/items/42", headers=headers)
print("Status Code:", response.status_code)
print("Response JSON:", response.json())
# 添加查询参数
# params:一个字典,包含 URL 查询参数
params = {'q': 'test'}
response = requests.get("http://localhost:8000/items/42", params=params)
print("Status Code:", response.status_code)
print("Response JSON:", response.json())
# 使用 requests 时,可能会遇到各种异常,如网络错误、超时等,可以用异常处理来处理这些错误
import requests
from requests.exceptions import HTTPError, Timeout
try:
response = requests.get("http://localhost:8000/items/42", timeout=5)
response.raise_for_status() # 如果状态码是 4xx 或 5xx,抛出 HTTPError
except HTTPError as http_err:
print(f'HTTP error occurred: {http_err}')
except Timeout as timeout_err:
# timeout:设置请求的超时时间,防止请求长时间阻塞
print(f'Timeout error occurred: {timeout_err}') #
except Exception as err:
print(f'Other error occurred: {err}')
else:
print('Success!')
print("Response JSON:", response.json())