什么是Web框架和FastAPI?¶
在开始之前,我们先搞清楚几个基础概念:
Web框架:简单来说,Web框架就是帮你快速搭建Web应用的工具。它封装了处理HTTP请求、路由、数据处理等复杂细节,让你能专注于业务逻辑。想象一下,如果没有框架,你需要自己处理socket连接、解析HTTP协议、路由分发等,这会非常繁琐。
FastAPI:这是一个基于Python的现代Web框架,它的核心特点是高性能(基于Starlette和Pydantic)、自动生成API文档(Swagger UI和ReDoc)、支持异步编程(适合高并发场景),以及数据验证。对于Python开发者来说,FastAPI已经成为构建RESTful API的首选框架之一。
安装与基础示例¶
安装FastAPI和服务器¶
FastAPI本身是Python库,但需要一个ASGI服务器来运行(类似Django的Gunicorn+Uvicorn)。这里我们用Uvicorn作为服务器:
pip install fastapi uvicorn
第一个“Hello World”应用¶
创建一个main.py文件,输入以下代码:
from fastapi import FastAPI
# 创建FastAPI应用实例
app = FastAPI()
# 定义路由:当访问根路径("/")时触发
@app.get("/")
def read_root():
return {"message": "Hello, FastAPI!"}
运行应用¶
在终端执行:
uvicorn main:app --reload
main:app:表示从main.py文件中导入名为app的FastAPI实例--reload:自动检测代码变化并重启服务器,方便开发
现在打开浏览器访问 http://localhost:8000,就能看到返回的JSON数据:{"message": "Hello, FastAPI!"}。
路由与参数¶
路径参数¶
你可以在URL中定义动态参数,比如获取用户ID的接口:
@app.get("/users/{user_id}")
def get_user(user_id: int): # 参数类型为int,自动验证
return {"user_id": user_id, "message": f"User {user_id} data"}
- 访问
http://localhost:8000/users/123,会返回{"user_id": 123, "message": "User 123 data"} - FastAPI会自动验证参数类型(如
user_id必须是整数,否则返回错误)
查询参数¶
如果需要传递可选参数,可以用查询参数:
@app.get("/search")
def search_items(query: str = None, limit: int = 10):
return {"query": query, "limit": limit}
- 访问
http://localhost:8000/search?query=book&limit=5,返回{"query": "book", "limit": 5} - 参数默认值(如
query: str = None)表示该参数可选
数据验证与Pydantic¶
FastAPI使用Pydantic库进行数据验证和序列化,确保请求数据符合预期格式。
定义数据模型¶
创建一个Item模型:
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
is_offer: bool = None # 可选字段,默认None
使用模型接收请求数据¶
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price}
- 当发送POST请求到
/items/,并在请求体中传入JSON数据(如{"name": "apple", "price": 5.99})时,FastAPI会自动验证数据类型 - 如果数据格式错误(如
price写成字符串),会返回清晰的错误提示
请求方法与数据处理¶
GET vs POST¶
- GET:用于获取数据(如查询列表),参数放在URL中,不适合提交敏感数据
- POST:用于提交数据(如创建资源),参数放在请求体中,更安全
处理POST请求(JSON数据)¶
用上面定义的Item模型处理JSON数据:
@app.post("/items/")
def create_item(item: Item):
return {"message": f"Created {item.name}", "price": item.price}
处理表单数据¶
如果是HTML表单提交,用Form类:
from fastapi import Form
@app.post("/login")
def login(username: str = Form(...), password: str = Form(...)):
return {"username": username, "status": "logged in"}
Form(...)表示该参数必填,用户提交表单时会自动解析
自动生成API文档¶
FastAPI最实用的特性之一是自动生成交互式API文档,不需要手动写文档!
访问Swagger UI¶
运行应用后,访问 http://localhost:8000/docs,就能看到可视化的API文档界面:
- 可以直接在页面上测试所有接口(点击”Try it out”)
- 自动显示参数说明、返回格式和示例数据
ReDoc文档¶
访问 http://localhost:8000/redoc,是另一种格式的API文档,更简洁直观。
异步支持(进阶了解)¶
FastAPI支持异步编程,适合处理耗时操作(如数据库查询、外部API调用):
from fastapi import FastAPI
import asyncio
app = FastAPI()
@app.get("/async-data")
async def get_async_data():
# 模拟异步操作(如数据库查询)
await asyncio.sleep(1) # 等待1秒
return {"data": "This is async response"}
- 异步接口使用
async def定义,配合await关键字 - 高并发场景下,异步能显著提升性能
总结与实践建议¶
FastAPI的核心优势在于简单易用和自动生成文档,非常适合快速开发RESTful API。
初学者实践步骤:¶
- 安装FastAPI和Uvicorn
- 完成基础示例(Hello World、路径参数、查询参数)
- 使用Pydantic模型处理数据验证
- 尝试编写GET和POST接口,测试API文档
- 用异步函数处理简单耗时操作
进阶方向:¶
- 中间件(Middleware):处理所有请求/响应
- 依赖注入(Dependency Injection):复用代码逻辑
- 数据库集成(SQLAlchemy/FastAPI-SQLAlchemy)
- 中间件和CORS配置(处理跨域请求)
FastAPI的学习曲线平缓,从基础到进阶可以逐步扩展,建议结合官方文档和实际项目练习,很快就能上手!