FastAPI:超快速的现代 Python Web 框架!
大家好!今天我要介绍一个特别炫酷的 Python Web 框架 -FastAPI!它不仅速度超快(和 Node.js、Go 相当),而且开发体验一级棒!FastAPI 基于 Python 3.6+ 的类型提示功能,能自动生成 API 文档,还内置了数据验证功能。如果你想开发高性能的 API 服务,FastAPI 绝对是你的不二之选!
1. 快速入门
首先安装 FastAPI 和 ASGI 服务器:
# 安装所需包
pip install fastapi uvicorn
# 创建第一个API
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello FastAPI!"}
# 运行服务器: uvicorn main:app --reload
小贴士: FastAPI 默认支持异步编程!使用async def
定义异步路由处理函数,性能会更好。但如果你不熟悉异步编程,使用普通的def
也完全没问题。
2. 路径参数和查询参数
FastAPI 的参数处理非常优雅:
from fastapi import FastAPI
from typing import Optional
app = FastAPI()
# 路径参数
@app.get("/users/{user_id}")
asyncdef read_user(user_id: int):
return {"user_id": user_id}
# 查询参数
@app.get("/items/")
asyncdef read_items(skip: int = 0, limit: int = 10, q: Optional[str] = None):
items = [{"id": i} for i in range(skip, skip + limit)]
if q:
items.append({"search": q})
return items
重要提示: 注意类型注解的使用!FastAPI 会:
自动验证参数类型 自动转换数据类型 在 API 文档中显示参数类型
3. 请求体和数据模型
使用 Pydantic 模型进行数据验证:
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List, Optional
class Item(BaseModel):
name: str
price: float
description: Optional[str] = None
tags: List[str] = []
app = FastAPI()
@app.post("/items/")
asyncdef create_item(item: Item):
return item
@app.put("/items/{item_id}")
asyncdef update_item(item_id: int, item: Item):
return {"item_id": item_id, **item.dict()}
小贴士: Pydantic 模型不仅可以验证数据,还能自动生成 OpenAPI(Swagger)文档!访问/docs
就能看到漂亮的 API 文档。
4. 实战示例:待办事项 API
让我们创建一个完整的待办事项 API:
from fastapi import FastAPI, HTTPException, status
from pydantic import BaseModel
from typing import List, Optional
from datetime import datetime
app = FastAPI()
# 数据模型
class TodoBase(BaseModel):
title: str
description: Optional[str] = None
priority: int = 1
class TodoCreate(TodoBase):
pass
class Todo(TodoBase):
id: int
created_at: datetime
done: bool = False
class Config:
orm_mode = True
# 模拟数据库
todos = []
todo_id_counter = 1
# API endpoints
@app.post("/todos/", response_model=Todo, status_code=status.HTTP_201_CREATED)
asyncdef create_todo(todo: TodoCreate):
global todo_id_counter
new_todo = Todo(
id=todo_id_counter,
created_at=datetime.now(),
**todo.dict()
)
todos.append(new_todo)
todo_id_counter += 1
return new_todo
@app.get("/todos/", response_model=List[Todo])
asyncdef list_todos(skip: int = 0, limit: int = 10):
return todos[skip : skip + limit]
@app.get("/todos/{todo_id}", response_model=Todo)
asyncdef get_todo(todo_id: int):
for todo in todos:
if todo.id == todo_id:
return todo
raise HTTPException(status_code=404, detail="Todo not found")
@app.put("/todos/{todo_id}/toggle", response_model=Todo)
asyncdef toggle_todo(todo_id: int):
for todo in todos:
if todo.id == todo_id:
todo.done = not todo.done
return todo
raise HTTPException(status_code=404, detail="Todo not found")
@app.delete("/todos/{todo_id}", status_code=status.HTTP_204_NO_CONTENT)
asyncdef delete_todo(todo_id: int):
for i, todo in enumerate(todos):
if todo.id == todo_id:
todos.pop(i)
return
raise HTTPException(status_code=404, detail="Todo not found")
小贴士: FastAPI 的错误处理非常优雅,使用HTTPException
可以轻松返回正确的 HTTP 状态码和错误信息。
5. 中间件和依赖注入
FastAPI 支持中间件和依赖注入系统:
from fastapi import FastAPI, Depends, Header
from typing import Optional
app = FastAPI()
# 中间件示例
@app.middleware("http")
asyncdef add_response_header(request, call_next):
response = await call_next(request)
response.headers["X-Custom-Header"] = "Custom Value"
return response
# 依赖注入示例
asyncdef get_token_header(x_token: Optional[str] = Header(None)):
ifnot x_token:
raise HTTPException(status_code=400, detail="X-Token header missing")
return x_token
@app.get("/protected-route/")
asyncdef protected_route(token: str = Depends(get_token_header)):
return {"token": token}
今天的 Python 学习之旅就到这里啦!记得动手敲代码,可以尝试以下练习:
给待办事项 API 添加用户认证 实现待办事项的优先级排序 添加截止日期功能 集成数据库(如 SQLAlchemy) 添加任务标签功能
祝大家学习愉快,Python学习节节高!