FastAPI响应
在 FastAPI 中,响应(Response)是 API 的核心部分之一,它决定了服务器如何将数据返回给客户端。FastAPI 提供了多种方式来自定义和处理响应,包括使用标准的 JSON 响应、自定义响应格式、添加响应头等。
1. 响应模型
默认情况下,FastAPI 会将路径操作函数返回的任何数据转换为 JSON 格式,并使用 application/json
作为响应的内容类型。然而,开发者可以通过使用 Pydantic 模型来定义和验证响应的数据结构。
定义响应模型:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
@app.get("/items/{item_id}", response_model=Item)
async def read_item(item_id: int):
return {"name": "Foo", "description": "A test item", "price": 42.0, "tax": 3.5}
在上述例子中,response_model=Item
表示返回的数据必须符合 Item
模型的结构和类型。
2. 自定义响应
FastAPI 提供了多种自定义响应的方式,包括直接使用 Response
类、返回文件、返回 HTML 等。
- 使用 Response 类
Response
类允许开发者完全控制响应的内容、状态码和媒体类型。
from fastapi import FastAPI, Response
app = FastAPI()
@app.get("/custom-response")
async def custom_response():
content = "This is a custom response"
return Response(content=content, media_type="text/plain")
- 返回文件
使用 FileResponse
可以方便地返回文件内容。
from fastapi import FastAPI
from fastapi.responses import FileResponse
app = FastAPI()
@app.get("/download")
async def download_file():
return FileResponse("path/to/your/file.txt", media_type='application/octet-stream', filename="file.txt")
- 返回 HTML
使用 HTMLResponse
可以返回 HTML 内容。
from fastapi import FastAPI
from fastapi.responses import HTMLResponse
app = FastAPI()
@app.get("/html", response_class=HTMLResponse)
async def get_html():
html_content = "<html><body><h1>Hello, World!</h1></body></html>"
return HTMLResponse(content=html_content)
3. 自定义状态码
可以通过 status_code
参数来设置自定义状态码。
from fastapi import FastAPI, status
app = FastAPI()
@app.post("/items/", status_code=status.HTTP_201_CREATED)
async def create_item(name: str):
return {"name": name}
在上述例子中,POST 请求成功时将返回状态码 201 Created
。
4. 添加响应头
可以通过 Response
对象添加自定义响应头。
from fastapi import FastAPI, Response
app = FastAPI()
@app.get("/headers")
async def custom_headers(response: Response):
response.headers["X-Custom-Header"] = "Custom value"
return {"message": "Check the custom header"}
5. StreamingResponse
StreamingResponse
允许逐步返回内容,适用于返回大文件或流数据。
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import io
app = FastAPI()
@app.get("/stream")
async def stream():
def iterfile():
for i in range(100):
yield f"line {i}\n"
return StreamingResponse(iterfile(), media_type="text/plain")
6. RedirectResponse
RedirectResponse
用于重定向请求到另一个 URL。
from fastapi import FastAPI
from fastapi.responses import RedirectResponse
app = FastAPI()
@app.get("/old-path")
async def redirect():
return RedirectResponse(url="/new-path")
@app.get("/new-path")
async def new_path():
return {"message": "This is the new path"}
7. JSONResponse
JSONResponse
允许开发者返回自定义的 JSON 响应,特别适用于需要手动构建 JSON 响应的情况。
from fastapi import FastAPI
from fastapi.responses import JSONResponse
app = FastAPI()
@app.get("/custom-json")
async def custom_json():
content = {"message": "Hello, World!"}
return JSONResponse(content=content, status_code=200)
8. UJSONResponse
UJSONResponse
是使用 ujson
库的响应类,具有更快的 JSON 编码和解码速度。
from fastapi import FastAPI
from fastapi.responses import UJSONResponse
app = FastAPI()
@app.get("/ujson", response_class=UJSONResponse)
async def get_ujson():
content = {"message": "Hello, FastAPI with uJSON!"}
return content
9. PlainTextResponse
PlainTextResponse
用于返回纯文本响应。
from fastapi import FastAPI
from fastapi.responses import PlainTextResponse
app = FastAPI()
@app.get("/text", response_class=PlainTextResponse)
async def get_text():
return "This is a plain text response"
10. 总结
FastAPI 提供了多种方式来处理和自定义响应,从简单的 JSON 响应到复杂的流式响应。通过使用响应模型、状态码、自定义响应头和不同类型的响应类,开发者可以灵活地构建符合需求的 API 响应。