2026/1/24 13:01:13
网站建设
项目流程
cdr里做网站超级链接,wordpress jet插件,朋友做的网站图片不显示不出来,怎么搭建网站后台1. 引言#xff1a;由于“太快”而带来的烦恼
你是否经历过这样的场景#xff1f;
周五下午#xff0c;你兴致勃勃地用 pip install fastapi 开启了一个新项目。main.py 里只有 20 行代码#xff0c;一切都跑得飞快#xff0c;你觉得自己像个风一样的男子。
然而#xff…1. 引言由于“太快”而带来的烦恼你是否经历过这样的场景周五下午你兴致勃勃地用pip install fastapi开启了一个新项目。main.py里只有 20 行代码一切都跑得飞快你觉得自己像个风一样的男子。然而两周后情况变了。那个曾经清秀的main.py膨胀到了 2000 行。数据库连接、Pydantic 模型、路由逻辑、鉴权代码全部纠缠在一起。你想修改一个用户的 API结果不小心弄崩了商品的查询功能。此时的你面对着屏幕上那一坨“意大利面条代码”Spaghetti Code只想把它关掉回家睡觉。FastAPI 的“快”是双刃剑。它不强制你遵循特定的结构但这不代表你不需要结构。今天我们就来谈谈如何通过合理的架构模式和最佳实践将你的 FastAPI 项目打造成一座稳固、可扩展的摩天大楼。2. 概念拆解如果你是公司的 CEO为了理解为什么我们需要分层架构我们来打个比方。想象你开了一家初创公司这就是你的 App。初创阶段单文件模式整个公司只有你一个人。你是 CEO也是销售还是保洁阿姨。所有事情你都亲力亲为所有逻辑都在main.py。这在创业初期Demo没问题效率极高。扩张阶段生产级架构业务做大了你不能再自己扫地了。你需要组建部门销售部专门负责拉客Routers处理路由请求。后勤部专门负责物资Schemas定义数据格式。技术部专门负责底层设施Database/CRUD处理数据库交互。外包团队随叫随到按需服务Dependencies依赖注入。这就是我们今天要讲的核心关注点分离Separation of Concerns。FastAPI 提供了两个最强大的武器来实现这一目标APIRouter部门拆分和Dependency Injection按需服务。3. 动手实战重构你的main.py我们要做的第一件事就是肢解那个臃肿的main.py。3.1 理想的文件结构不要把鸡蛋放在一个篮子里。一个标准的生产级目录结构应该长这样Plaintext/* by 01130.hk - online tools website : 01130.hk/zh/gifcompression.html */ /app /routers # 销售部处理路径和请求 users.py items.py /schemas # 后勤部Pydantic 模型数据契约 user.py item.py /crud # 技术部数据库操作逻辑 user.py /core # 核心配置 config.py main.py # CEO统筹全局3.2 路由拆分APIRouter假设我们要把用户相关的逻辑拆出去。第一步创建分部app/routers/users.pyPython/* by 01130.hk - online tools website : 01130.hk/zh/gifcompression.html */ from fastapi import APIRouter # 这里的 prefix/users 意味着所有在这个路由下的路径都会自动加上 /users 前缀 # tags[users] 用于在 Swagger UI 文档中分组 router APIRouter(prefix/users, tags[users]) router.get(/) async def read_users(): return [{username: Rick}, {username: Morty}] router.get(/me) async def read_user_me(): return {username: fakecurrentuser}第二步总部汇报app/main.pyCEO 需要知道有哪些部门存在。Pythonfrom fastapi import FastAPI from app.routers import users, items # 假设你也有 items app FastAPI() # 将分部的路由注册到主应用中 app.include_router(users.router) # app.include_router(items.router) app.get(/) async def root(): return {message: Hello World}代码解析APIRouter就像是一个微型的FastAPI实例。app.include_router就像是插线板把各个模块的插头插到主电源上。为什么这么做你的main.py再次变回了清爽的状态而且多人协作时你写users我写items互不冲突。4. 进阶深潜三个你必须遵守的“军规”仅仅拆分文件还不够这里有三个区分“新手”和“老鸟”的关键细节。军规一输入与输出模型分离 (DTO Pattern)很多新手会直接把数据库模型ORM Model返回给前端这是大忌这会导致你把用户的密码哈希值也一并泄露出去。最佳实践使用不同的 Pydantic 模型分别对应“请求”和“响应”。Python# app/schemas/user.py from pydantic import BaseModel, EmailStr # 1. 用户注册时填写的包含密码 class UserCreate(BaseModel): username: str password: str email: EmailStr # 2. 返回给前端展示的绝对不能包含密码 class UserResponse(BaseModel): id: int username: str email: EmailStr class Config: from_attributes True # 允许从 ORM 模型读取数据在路由中使用Pythonrouter.post(/, response_modelUserResponse) # 明确告诉 FastAPI 使用哪个模型过滤返回值 async def create_user(user: UserCreate): # 这里处理创建逻辑... # return db_user_object # FastAPI 会自动根据 UserResponse 过滤掉 db_user_object 中的 password 字段 pass军规二依赖注入是你的救命稻草 (Dependency Injection)不要在全局范围内初始化数据库连接或复杂的逻辑对象。使用Depends。错误示范全局变量Pythondb SessionLocal() # 危险连接可能断开或者在并发时混乱 app.get(/users) def get_users(): return db.query(User).all()正确示范依赖注入Python# app/dependencies.py def get_db(): db SessionLocal() try: yield db finally: db.close() # 确保请求结束后关闭连接 # 在路由中使用 from fastapi import Depends from sqlalchemy.orm import Session router.get(/users) def get_users(db: Session Depends(get_db)): # 只有在这个请求进来时才会创建连接 return crud.get_users(db)为什么安全性finally块确保了即使发生错误数据库连接也能正确关闭。可测试性写单元测试时你可以轻松地用app.dependency_overrides把真实的数据库替换成 Mock 对象而不需要去 hack 全局变量。军规三配置管理不要硬编码不要把SECRET_KEY或数据库 URL 写死在代码里。使用pydantic-settings读取环境变量。Python# app/core/config.py from pydantic_settings import BaseSettings class Settings(BaseSettings): database_url: str secret_key: str debug: bool False class Config: env_file .env settings Settings()这样你的代码在开发环境、测试环境和生产环境之间切换时只需要更换.env文件而不需要改动任何一行代码。5. 总结与延伸总结FastAPI 的最佳实践核心在于**“秩序”**使用APIRouter拆分业务逻辑别让main.py成为垃圾场。严格区分Pydantic Schemas输入/输出和ORM Models数据库保护数据安全。利用Dependency Injection管理数据库会话和共享逻辑提升可测试性。