fastapi需用uvicorn启动而非app.run(),配置pydantic_settings.basesettings替代已移除的basesettings,数据库连接须用依赖注入+yield确保关闭,日志须统一使用uvicorn内置logger避免冲突。

用 uvicorn 启动时别直接写 app.run()
FastAPI 本身不带服务器,app.run() 是 Flask 风格的写法,直接用会报 AttributeError: 'FastAPI' object has no attribute 'run'。生产环境必须用 ASGI 服务器,首选 uvicorn。
- 正确启动命令:
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4 --reload(开发加--reload,生产必须去掉) -
--workers数建议设为2 * CPU核心数 + 1,单核机器别设超过 3,否则协程调度反而变慢 - 别在代码里调
uvicorn.run()启动——它会阻塞主线程,导致无法做健康检查或信号捕获
BaseSettings 从 pydantic v2 起已移除
很多旧模板还在用 from pydantic import BaseSettings,但 Pydantic v2(FastAPI 0.103+ 默认依赖)已废弃该类。强行用会触发 ImportError: cannot import name 'BaseSettings'。
- 改用
pydantic_settings.BaseSettings,需额外安装:pip install pydantic-settings - 配置类要加
class Config: env_file = ".env"才能自动读取环境变量文件 - 字段默认值如果是
None,又没设default_factory,运行时可能被当成必填项抛ValidationError
数据库连接池不能靠 SessionLocal() 每次新建
直接在路由里写 db = SessionLocal() 看似简单,但会导致连接泄漏、超时、连接数打满。PostgreSQL 常见报错:too many clients already。
云枫工作室企业网站源代码(.net)Version 4.0 是云枫工作室基于.net环境独立开发的一套适用于企业使用的企业网站系统。.net+access.网站使用了模板动态生成静态页面技术,前台页面是生成纯静态的。网站包括了信息管理,产品管理,新闻管理和在线留言。可以在后台设置网站名称,标题,关键字和网站描述。配置说明:服务器空间需要支持.net2.0,还要有可写的权限(这个是必要的,因为网站前
- 必须用依赖注入 +
yield模式:定义一个get_db()依赖函数,在try/finally里yield db,确保db.close()总被执行 -
create_engine(..., pool_pre_ping=True)必须开,否则空闲连接断开后首次查询会卡住或报Lost connection to MySQL server - 别把
SessionLocal当全局变量反复调用——它只是工厂函数,不是连接实例
日志输出别用 print() 或默认 logging.getLogger()
Uvicorn 自带日志系统,和 Python 默认 logger 冲突会导致日志重复、格式错乱,甚至阻塞请求。常见现象:一条请求打出两行日志,其中一行没时间戳,另一行没有 trace_id。
立即学习“Python免费学习笔记(深入)”;
- 统一用
logging.getLogger("uvicorn.access")和"uvicorn.error"获取日志器,它们已接入 Uvicorn 的结构化输出 - 自定义中间件里打业务日志,要用
request.state传 trace_id,否则日志无法关联请求链路 - 别在
logger.info()里拼字符串,用logger.info("user %s login", user_id)—— 字符串格式化在日志级别被过滤时不会执行,省 CPU
FastAPI 生产配置真正的难点不在语法,而在生命周期对齐:ASGI 生命周期、数据库连接生命周期、日志上下文生命周期,三者稍有错位,问题就藏得深、复现难。









