当前位置: 首页 > news >正文

fastapi详解

老规矩老规矩,先带大家通俗理解一遍:

FastAPI 一句话总结:Python 里一款 “快、好写、不用手动写文档” 的 API 开发工具,专门用来做后端接口(比如 App / 网站 / 小程序要拿数据、存数据时,后端提供的 “数据通道”)。

用最通俗的话讲核心亮点:

  1. 写得快:语法特别简单,比如定义一个 “获取用户信息” 的接口,几行代码就搞定,不用写一堆复杂配置;
  2. 跑得也快:支持异步(能同时处理很多请求不卡顿),速度接近 Node.js/Go,比 Flask 快得多;
  3. 不用写文档:写完接口自动生成交互式文档(浏览器打开就能调试),前端同事直接用,不用你单独写说明;
  4. 不容易错:用 Python 自带的 “类型注解”(比如指定参数是整数 / 字符串),自动校验数据,比如别人传个文字当年龄,会自动报错,不用你手动判断。

举个最直观的例子:想做一个 “根据名字打招呼” 的接口,用 FastAPI 只需要 3 步:

  1. 装依赖:pip install fastapi uvicorn
  2. 写代码(main.py):
from fastapi import FastAPI
app = FastAPI()# 定义接口:访问 /hello/名字 → 返回打招呼信息
@app.get("/hello/{name}")
def say_hello(name: str):  # 明确 name 是字符串,自动校验return {"message": f"你好,{name}!"}
  1. 运行:uvicorn main:app --reload,然后浏览器打开 http://127.0.0.1:8000/docs,直接输入名字就能测试接口,文档也自动生成好了。

核心用途:给前端、App 提供数据接口(比如登录、获取商品列表、上传文件),开发效率高、运行快,还不用操心文档和数据校验的琐事。

FastAPI 详解:现代高性能 Python Web 框架

FastAPI 是一款基于 Python 3.6+ 的 高性能、易上手、自动生成 API 文档 的 Web 框架,核心优势是「速度快(接近 Node.js/Go)、类型提示友好、开发效率高」,专为构建 API 设计(支持 RESTful API、GraphQL、WebSocket 等),广泛用于后端服务、微服务、数据接口开发。

一、核心特点(为什么选 FastAPI?)

  1. 极致性能:基于 Starlette(异步 Web 框架)和 Pydantic(数据验证),性能远超 Flask,接近 Node.js/Go 的异步框架;
  2. 自动生成 API 文档:无需额外配置,自动生成交互式文档(Swagger UI / ReDoc),接口调试直接在浏览器完成;
  3. 类型提示即验证:用 Python 类型注解定义请求参数 / 响应模型,Pydantic 自动完成数据校验、类型转换,减少重复代码;
  4. 原生支持异步:完美支持 async/await 语法,高效处理并发请求(如异步数据库、异步 HTTP 调用);
  5. 功能全面:内置数据验证、依赖注入、身份认证、CORS 跨域、请求限流等核心功能,无需额外插件;
  6. 易学习:语法简洁,兼容 Flask 风格,Python 开发者可快速上手。

二、安装与最小示例

1. 安装依赖

# 核心安装(FastAPI + 异步服务器 Uvicorn)
pip install fastapi uvicorn
# 可选依赖(按需安装)
pip install pydantic[email]  # 邮件验证
pip install python-multipart  # 处理文件上传
pip install httpx  # 异步 HTTP 客户端

2. 最小 Hello World 示例

创建文件 main.py

from fastapi import FastAPI# 1. 初始化 FastAPI 应用实例
app = FastAPI(title="我的第一个 FastAPI 应用",  # 文档标题description="FastAPI 入门示例",    # 文档描述version="1.0.0"                   # 版本
)# 2. 定义路由(GET 请求)
@app.get("/")  # 路径:/,请求方法:GET
async def root():  # 支持 async 异步函数,也支持普通同步函数return {"message": "Hello FastAPI!"}  # 自动转为 JSON 响应# 3. 带路径参数的路由
@app.get("/hello/{name}")  # 路径参数:name
async def say_hello(name: str):  # 类型注解:name 必须是字符串return {"message": f"Hello, {name}!"}

3. 运行应用

# 命令格式:uvicorn 文件名:应用实例 --reload(热重载,开发环境用)
uvicorn main:app --reload

运行后输出:

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [xxxxx] using WatchFiles

4. 访问与调试

  • 接口访问:浏览器打开 http://127.0.0.1:8000/hello/Alice,返回 {"message":"Hello, Alice!"}
  • 自动文档:
    • Swagger UI(推荐):http://127.0.0.1:8000/docs(支持在线调试接口);
    • ReDoc:http://127.0.0.1:8000/redoc(更简洁的文档样式)。

三、核心功能详解

1. 请求参数处理(类型注解驱动)

FastAPI 支持 4 种核心参数类型,均通过类型注解定义,自动校验 + 转换:

(1)路径参数(Path Parameters)

用于 URL 路径中的参数(如 /users/{user_id}):

from fastapi import FastAPI
from typing import Optionalapp = FastAPI()# 基础路径参数(指定类型)
@app.get("/users/{user_id}")
async def get_user(user_id: int):  # user_id 必须是整数,自动转换字符串为 intreturn {"user_id": user_id, "type": type(user_id).__name__}# 路径参数枚举(限制可选值)
from enum import Enum
class ItemType(str, Enum):book = "book"toy = "toy"@app.get("/items/{item_type}")
async def get_items(item_type: ItemType):  # 仅允许 book/toy 两个值return {"item_type": item_type.value}
(2)查询参数(Query Parameters)

用于 URL 中 ? 后的参数(如 /items?skip=0&limit=10):

# 查询参数:默认值 + 可选参数
@app.get("/items")
async def get_items(skip: int = 0,  # 默认值 0,必须是 intlimit: Optional[int] = None,  # 可选参数,可为 Noneq: Optional[str] = ""  # 字符串类型,默认空字符串
):return {"skip": skip, "limit": limit, "q": q}# 访问示例:/items?skip=10&limit=20&q=test → 返回对应参数
(3)请求体(Request Body)

用于 POST/PUT 等请求的复杂数据(JSON 格式),需用 Pydantic 模型定义:

from pydantic import BaseModel# 定义请求体模型(类型注解 + 可选校验)
class UserCreate(BaseModel):username: stremail: Optional[str] = None  # 可选邮箱age: intis_active: bool = True  # 默认值 True# POST 请求接收请求体
@app.post("/users", response_model=UserCreate)  # response_model 定义响应模型(自动过滤多余字段)
async def create_user(user: UserCreate):  # user 自动解析 JSON 并校验# 模拟存入数据库return user  # 自动转为 JSON 响应,字段与 UserCreate 一致
(4)表单数据(Form Data)

处理表单提交(如登录表单),需安装 python-multipart

from fastapi import Form@app.post("/login")
async def login(username: str = Form(...),  # ... 表示必填项password: str = Form(...)
):return {"username": username, "message": "登录成功"}

2. 响应处理

(1)响应模型(response_model)

通过 response_model 控制响应字段、类型和校验,自动过滤敏感数据:

class UserOut(BaseModel):username: stremail: Optional[str] = Noneis_active: bool# 仅返回 UserOut 定义的字段,忽略密码等敏感信息
@app.get("/users/{user_id}", response_model=UserOut)
async def get_user(user_id: int):return {"username": "alice", "email": "alice@example.com", "is_active": True, "password": "123456"}
(2)自定义响应状态码
from fastapi import status@app.post("/users", response_model=UserCreate, status_code=status.HTTP_201_CREATED)
async def create_user(user: UserCreate):return user  # 响应状态码 201(创建成功)
(3)其他响应类型

支持 JSON、HTML、文件、流响应等:

from fastapi.responses import HTMLResponse, FileResponse# HTML 响应
@app.get("/html", response_class=HTMLResponse)
async def get_html():return "<h1>Hello FastAPI!</h1>"# 文件下载
@app.get("/download")
async def download_file():return FileResponse("test.txt", filename="下载文件.txt")

3. 依赖注入(Dependency Injection)

FastAPI 内置依赖注入系统,用于复用逻辑(如身份认证、数据库连接、参数校验):

from fastapi import Depends# 定义依赖项(可复用逻辑)
async def get_current_user(token: str = Query(...)):# 模拟验证 tokenif token != "valid_token":raise HTTPException(status_code=401, detail="无效 token")return {"username": "alice", "role": "user"}# 依赖注入:get_current_user 的返回值会作为 current_user 参数传入
@app.get("/profile")
async def get_profile(current_user: dict = Depends(get_current_user)):return {"user": current_user, "profile": "个人信息"}

4. 身份认证与授权

(1)OAuth2 + JWT 认证(常用)

需安装依赖:pip install python-jose[cryptography] passlib[bcrypt]

from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from jose import JWTError, jwt
from passlib.context import CryptContext
from datetime import datetime, timedelta# 配置
SECRET_KEY = "your-secret-key"  # 生产环境用环境变量存储
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30# 密码加密
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")# OAuth2 认证方案
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")# 生成 JWT Token
def create_access_token(data: dict):to_encode = data.copy()expire = datetime.utcnow() + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)to_encode.update({"exp": expire})encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)return encoded_jwt# 登录接口(获取 Token)
@app.post("/token")
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):# 模拟查询用户(生产环境从数据库查询)if form_data.username != "alice" or not pwd_context.verify(form_data.password, "$2b$12$..."):raise HTTPException(status_code=401, detail="用户名或密码错误")access_token = create_access_token(data={"sub": form_data.username})return {"access_token": access_token, "token_type": "bearer"}# 受保护接口(需 Token 认证)
@app.get("/protected")
async def protected_route(token: str = Depends(oauth2_scheme)):try:payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])username: str = payload.get("sub")if username is None:raise HTTPException(status_code=401, detail="无效 Token")except JWTError:raise HTTPException(status_code=401, detail="无效 Token")return {"message": f"欢迎 {username},这是受保护接口"}

5. 异步支持

FastAPI 原生支持异步,可直接使用 async/await 调用异步操作(如异步数据库、异步 HTTP 客户端):

import httpx# 异步 HTTP 调用(需安装 httpx)
@app.get("/async-request")
async def async_request():async with httpx.AsyncClient() as client:response = await client.get("https://api.github.com")return {"status_code": response.status_code, "data": response.json()}# 异步数据库操作(以 SQLAlchemy 2.0 为例)
@app.get("/async-db")
async def async_db_query():async with db.async_session() as session:result = await session.execute(select(User).limit(10))users = result.scalars().all()return {"users": users}

6. 异常处理

自定义异常响应,统一错误格式:

from fastapi import HTTPException, Request
from fastapi.responses import JSONResponse# 自定义异常类
class CustomException(Exception):def __init__(self, detail: str, status_code: int = 400):self.detail = detailself.status_code = status_code# 全局异常处理器
@app.exception_handler(CustomException)
async def custom_exception_handler(request: Request, exc: CustomException):return JSONResponse(status_code=exc.status_code,content={"detail": exc.detail, "code": exc.status_code})# 触发自定义异常
@app.get("/error")
async def trigger_error():raise CustomException(detail="自定义异常示例", status_code=400)

7. CORS 跨域配置

解决前端跨域请求问题:

from fastapi.middleware.cors import CORSMiddlewareapp.add_middleware(CORSMiddleware,allow_origins=["*"],  # 生产环境指定具体域名(如 ["https://your-frontend.com"])allow_credentials=True,allow_methods=["*"],  # 允许所有 HTTP 方法allow_headers=["*"],  # 允许所有请求头
)

四、生产环境部署

FastAPI 本身是「应用框架」,需搭配 ASGI 服务器(如 Uvicorn、Hypercorn)部署,推荐组合:

1. 基础部署(单服务器)

# 用 Uvicorn 启动(生产环境关闭 --reload,增加工作进程)
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4

2. 进阶部署(Nginx + Uvicorn + Supervisor)

  • Nginx:反向代理、负载均衡、静态资源服务;
  • Uvicorn:ASGI 服务器,处理 Python 异步请求;
  • Supervisor:进程管理,确保 Uvicorn 持续运行。

3. 容器化部署(Docker)

创建 Dockerfile

FROM python:3.10-slimWORKDIR /appCOPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txtCOPY . .CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]

构建并运行:

docker build -t fastapi-app .
docker run -d -p 8000:8000 fastapi-app

五、FastAPI vs 其他框架(对比)

框架性能开发效率自动文档异步支持适用场景
FastAPI极高(异步)内置原生支持API 开发、微服务、高并发场景
Flask中等(同步)需插件需插件小型应用、原型开发
Django中等(同步)需插件3.2 + 支持全栈应用、后台管理系统
Tornado高(异步)原生支持长连接、WebSocket 应用

六、总结与学习资源

核心优势

  • 适合快速构建高性能 API,尤其适合数据接口、微服务;
  • 类型注解驱动,代码可读性强、维护成本低;
  • 自动文档 + 数据校验,减少调试和文档编写时间;
  • 原生异步支持,轻松应对高并发场景。

学习资源

  1. 官方文档(最权威):FastAPI 中文文档
  2. 实战项目:Full Stack FastAPI Template(含前端、数据库、认证)
  3. 依赖库:Pydantic(数据验证)、SQLAlchemy(ORM)、httpx(异步 HTTP)

http://www.dtcms.com/a/608021.html

相关文章:

  • 免费房地产网站模板网站没有做实名认证
  • 做明星网站wordpress 右拉
  • 国外优秀个人网站欣赏怎样解除拦截网站设置
  • 免费网站站北京做网站公司
  • 网站建设前期分析做网站的底图尺寸多大
  • 彩票网站开发与建设wordpress文章编辑经典
  • 乐清网站开发公司网站建设提成
  • 做网站用小动画网站开发范本
  • 商城网站开发网常州建设网站平台
  • 鸿安建设集团网站郑州外贸营销网站建设
  • 成武菏泽网站建设物业管理软件
  • 我看别人做系统就直接网站下载文件页面优化
  • 网站建设服务收费烟台建设联合会网站
  • 培训 网站 模板新河县招聘信息网
  • 游戏开发和网站开发那个有前景庆阳网站设计制作
  • 默认网站停止相亲网站建设策划方案
  • 网站建设营销平台30_10_郑州网站制作
  • 网站建设wuhan网站为什么要icp备案
  • 人个做外贸用什么网站好免费空间申请注册
  • 网站描述优化哪个网站教做公众号
  • 九号线香网站建设网站做的一般怎么评价
  • 什么是erp企业管理系统关键词优化技巧有哪些
  • 2手房产App网站开发丹东电信网站备案
  • 石家庄新钥匙建站新app推广去哪里找
  • wap免费网站买别人做的网站能盗回吗
  • 青海建设厅网站通知农业开发公司好名字
  • 谈谈对电子商务网站建设与管理文档下载网站 建设
  • 网站制作公司 北京农药化肥网站建设
  • 北京网站建设公司华网天下下中国机械加工网官方网站
  • 网站网站建设公司上海优秀flash网站欣赏