news 2026/7/24 23:30:53

FastAPI做项目的后端准备

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FastAPI做项目的后端准备

FastAPI做项目的后端准备

文章目录

  • FastAPI做项目的后端准备
  • 前言
  • 一、理解框架之间的关系?
  • 二、Main里面的配置
  • 定义 lifespan 生命周期函数
    • 1. 引入必要的库
      • 代码说明:
    • 2. 多环境配置
      • 依赖
      • 相关文件一览
      • 三个环境对照表
      • 配置实现步骤
        • 1. 创建配置文件
        • 2. 创建环境文件
        • 4. 更新 database.py 使用配置
        • 5. 更新 main.py 使用配置
      • 配置验证
    • 3. 解决 Tortoise-ORM 警告:Module "app.models" has no models
      • 问题分析
      • 解决方案
        • 方案一:创建模型文件
      • 完整启动流程验证

前言

搭建项目框架,首先明确框架里面的内容

boss-api/├── main.py# FastAPI应用主入口│ ├── requirements.txt# Python依赖包│ └── app/# 应用核心代码├── __init__.py │ │ ├── models/# 数据模型层 (Tortoise ORM)│ ├── __init__.py │ ├── user.py# 用户相关模型│ ├── apis/# API路由层[接受参数,返回数据]│ ├── __init__.py │ └── user_api.py# 用户相关API│ └── schemas/# 数据验证层 (Pydantic)│ ├── __init__.py │ └── user.py# 用户请求/响应模型│ │ ├── services/# 业务服务层 (逻辑)│ ├── __init__.py │ ├── user.py# 用户相关的业务代码/方法│ │ ├── core/# 核心文件│ ├── __init__.py │ ├── database.py# 数据库连接信息├── config/# 配置文件│ ├── __init__.py │ ├── settings.py# 多环境配置

提示:以下是本篇文章正文内容,下面案例可供参考

一、理解框架之间的关系?

database:数据库配置文件
这个文件定义了Tortoise-ORM 连接MYSQL 数据库所需的所有配置信息

二、Main里面的配置

定义 lifespan 生命周期函数

1. 引入必要的库

首先,我们需要导入 FastAPI、Tortoise-ORM 以及异步上下文管理器:

fromfastapiimportFastAPIfromtortoiseimportTortoisefromcontextlibimportasynccontextmanager# 数据库配置(示例)TORTOISE_ORM={"connections":{"default":"mysql://user:password@localhost:3306/mydatabase"},"apps":{"models":{"models":["app.models","aerich.models"],"default_connection":"default",}},"use_tz":False,"timezone":"UTC",}## 2. 实现 lifespan 生命周期函数下面是使用 `@asynccontextmanager` 装饰器定义 lifespan 函数的完整示例: ```python@asynccontextmanagerasyncdeflifespan(app:FastAPI):""" 使用 lifespan 管理应用的生命周期。 在应用启动时初始化数据库连接,在应用关闭时释放连接。 这是 FastAPI 推荐的最佳实践。 """# 启动时执行的代码print("🚀 正在初始化 Tortoise-ORM...")# 启动阶段:初始化 Tortoise-ORM 连接awaitTortoise.init(config=TORTOISE_ORM)# 生成数据库表(仅开发环境使用)# await Tortoise.generate_schemas()print("✅ 数据库连接初始化完成")yield# 应用运行阶段# 关闭阶段:销毁数据库连接print("🛑 正在关闭数据库连接...")awaitTortoise.close_connections()print("✅ 数据库连接已关闭")# 创建 FastAPI 应用并传入 lifespanapp=FastAPI(title="Boss API",description="一个使用 FastAPI 和 Tortoise-ORM 的后端项目",version="1.0.0",lifespan=lifespan# 传入生命周期管理器)# 示例路由@app.get("/")asyncdefroot():return{"message":"欢迎使用 Boss API"}@app.get("/health")asyncdefhealth_check():return{"status":"healthy","database":"connected"}

代码说明:

  1. @asynccontextmanager装饰器:将异步函数转换为异步上下文管理器
  2. lifespan函数
    • 启动阶段:在yield之前执行,用于初始化资源(数据库连接)
    • 运行阶段yield之后应用正常运行
    • 关闭阶段yield之后执行,用于清理资源(关闭数据库连接)
  3. Tortoise.init():初始化数据库连接
  4. Tortoise.close_connections():关闭所有数据库连接
  5. app = FastAPI(lifespan=lifespan):将生命周期管理器传递给 FastAPI 应用

启动成功:

2. 多环境配置

依赖

pipinstallpydantic-settings

项目中已使用pydantic_settings.BaseSettings

相关文件一览

项目根目录/ ├── .env# 各环境共享的少量公共项├── .env.dev# 开发环境├── .env.test# 测试环境├── .env.prod# 生产环境(真实密钥,勿提交公开仓库)├── .gitignore# 忽略 .env.dev / .env.prod 等├── main.py# 使用 settings 初始化 FastAPI└── app/ ├── config/ │ └── settings.py# ★ 本节核心└── core/ └── database.py# ★ 从 settings 读库配置

三个环境对照表

环境英文典型用途调试数据库密钥来源
开发dev本机写代码、联调本地 MySQL.env.dev
测试test跑自动化测试、预发验证测试库(可清空).env.test
生产prod真实用户访问生产库环境变量

配置实现步骤

1. 创建配置文件

首先在app/config/settings.py中创建配置类:

# app/config/settings.pyfrompydantic_settingsimportBaseSettingsfromtypingimportOptionalclassSettings(BaseSettings):"""应用配置类"""# 基础配置APP_NAME:str="Boss API"APP_VERSION:str="1.0.0"DEBUG:bool=False# 数据库配置DATABASE_URL:strDATABASE_POOL_SIZE:int=5DATABASE_MAX_OVERFLOW:int=10# JWT配置SECRET_KEY:strALGORITHM:str="HS256"ACCESS_TOKEN_EXPIRE_MINUTES:int=30# 环境特定配置ENVIRONMENT:str="dev"# dev/test/prodclassConfig:env_file=".env"env_file_encoding="utf-8"case_sensitive=False# 创建全局配置实例settings=Settings()
2. 创建环境文件

在项目根目录创建不同环境的.env文件:

.env(共享配置):

# 各环境共享的少量公共项 APP_NAME=Boss API APP_VERSION=1.0.0 ALGORITHM=HS256 ACCESS_TOKEN_EXPIRE_MINUTES=30 DATABASE_POOL_SIZE=5 DATABASE_MAX_OVERFLOW=10

.env.dev(开发环境):

# 开发环境配置 ENVIRONMENT=dev DEBUG=true DATABASE_URL=mysql://user:password@localhost:3306/boss_dev SECRET_KEY=dev-secret-key-change-in-production

.env.test(测试环境):

# 测试环境配置 ENVIRONMENT=test DEBUG=false DATABASE_URL=mysql://user:password@localhost:3306/boss_test SECRET_KEY=test-secret-key

.env.prod(生产环境):

# 生产环境配置(真实密钥,勿提交公开仓库) ENVIRONMENT=prod DEBUG=false DATABASE_URL=${PROD_DATABASE_URL} # 从环境变量读取 SECRET_KEY=${PROD_SECRET_KEY} # 从环境变量读取
4. 更新 database.py 使用配置

修改app/core/database.py从配置读取数据库连接:

# app/core/database.pyfromapp.config.settingsimportsettingsdefget_tortoise_config():"""根据配置生成 Tortoise-ORM 配置"""return{"connections":{"default":settings.DATABASE_URL},"apps":{"models":{"models":["app.models","aerich.models"],"default_connection":"default",}},"use_tz":False,"timezone":"UTC",}TORTOISE_ORM=get_tortoise_config()
5. 更新 main.py 使用配置

修改main.py使用配置初始化 FastAPI:

# main.pyfromfastapiimportFastAPIfromtortoiseimportTortoisefromcontextlibimportasynccontextmanagerfromapp.config.settingsimportsettingsfromapp.core.databaseimportTORTOISE_ORM@asynccontextmanagerasyncdeflifespan(app:FastAPI):""" 使用 lifespan 管理应用的生命周期。 在应用启动时初始化数据库连接,在应用关闭时释放连接。 """# 启动时执行的代码print(f"🚀 正在初始化 Tortoise-ORM... [环境:{settings.ENVIRONMENT}]")# 启动阶段:初始化 Tortoise-ORM 连接awaitTortoise.init(config=TORTOISE_ORM)# 仅在开发环境生成数据库表ifsettings.DEBUG:print("🔧 开发环境:生成数据库表...")awaitTortoise.generate_schemas()print("✅ 数据库连接初始化完成")yield# 应用运行阶段# 关闭阶段:销毁数据库连接print("🛑 正在关闭数据库连接...")awaitTortoise.close_connections()print("✅ 数据库连接已关闭")# 创建 FastAPI 应用并传入 lifespanapp=FastAPI(title=settings.APP_NAME,description="一个使用 FastAPI 和 Tortoise-ORM 的后端项目",version=settings.APP_VERSION,lifespan=lifespan,debug=settings.DEBUG,)# 示例路由@app.get("/")asyncdefroot():return{"message":f"欢迎使用{settings.APP_NAME}","version":settings.APP_VERSION,"environment":settings.ENVIRONMENT,}@app.get("/health")asyncdefhealth_check():return{"status":"healthy","database":"connected","environment":settings.ENVIRONMENT,}

配置验证

创建验证路由检查当前配置:

# app/apis/config_api.pyfromfastapiimportAPIRouterfromapp.config.settingsimportsettings router=APIRouter(prefix="/config",tags=["配置"])@router.get("/")asyncdefget_config():"""获取当前配置(仅开发环境开放)"""ifnotsettings.DEBUG:return{"message":"配置信息仅在开发环境可见"}return{"app_name":settings.APP_NAME,"version":settings.APP_VERSION,"environment":settings.ENVIRONMENT,"debug":settings.DEBUG,"database_url":settings.DATABASE_URL[:50]+"..."ifsettings.DATABASE_URLelseNone,}

3. 解决 Tortoise-ORM 警告:Module “app.models” has no models

从启动日志中可以看到以下警告:

/Users/baimu/PycharmProjects/2603-p3/my/my-boss-fastApiProject/venv/lib/python3.12/site-packages/tortoise/apps.py:42: RuntimeWarning: Module "app.models" has no models self._load_from_config()

问题分析

这个警告表示 Tortoise-ORM 在app.models模块中没有找到任何模型定义。在您的TORTOISE_ORM配置中,指定了:

"models":["app.models","aerich.models"]

app.models模块要么不存在,要么存在但没有定义任何 Tortoise 模型类。

解决方案

方案一:创建模型文件
  1. 创建 models 目录和文件
    按照项目结构,在app/models/目录下创建模型文件:

    # app/models/user.pyfromtortoiseimportfields,modelsclassUser(models.Model):"""用户模型"""id=fields.IntField(pk=True)username=fields.CharField(max_length=50,unique=True)email=fields.CharField(max_length=100,unique=True)hashed_password=fields.CharField(max_length=128)is_active=fields.BooleanField(default=True)created_at=fields.DatetimeField(auto_now_add=True)updated_at=fields.DatetimeField(auto_now=True)classMeta:table="users"def__str__(self):returnself.username
  2. 创建init.py 文件
    app/models/__init__.py中导入模型:

    # app/models/__init__.pyfrom.userimportUser __all__=["User"]

完整启动流程验证

修复后,重新启动应用应该看到正常的启动日志:

INFO: Willwatchforchangesinthese directories:['/path/to/your/project']INFO: Uvicorn running on http://127.0.0.1:8000(Press CTRL+C to quit)INFO: Started reloader process[17071]using WatchFiles 🚀 正在初始化 Tortoise-ORM... INFO: Started server process[17073]INFO: Waitingforapplication startup. ✅ 数据库连接初始化完成 INFO: Application startup complete.
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/24 23:27:56

大模型核心技术RAG讲解

一.RAG技术原理 1.什么是RAG? Retrieval-Augmented Generation (RAG-检索增强生成) 是帮助大模型更好地回答问题的一种方式,在大模型的应用场景中,一个非常常见的需求是:手里有一堆文档,当遇到一个问题时,希望通过其中…

作者头像 李华
网站建设 2026/7/24 23:27:11

ImageGlass:跨平台图像浏览器的革命性体验

ImageGlass:跨平台图像浏览器的革命性体验 【免费下载链接】ImageGlass 🏞 A fast, open-source, modern image viewer for 90 formats – including WEBP, GIF, SVG, AVIF, JXL, HEIC and more – built for smooth browsing across Windows, macOS, an…

作者头像 李华
网站建设 2026/7/24 23:24:52

一张图看懂TOGAF元模型主要实体之间的关系

本文对TOGAF 元模型的主要实体元素之间的关系进行解读,并对元模型中提及的重要概念进行名词解释或者举例说明。为保证语言通俗易懂,用一家加工螺丝钉的生产企业“螺丝霸王”为例举例说明,以便降低理解难度。(图片来源:…

作者头像 李华
网站建设 2026/7/24 23:20:02

深入解析USB PD控制器TPS65981:从VBUS电压转换到端口管理的工程实践

1. 项目概述与核心价值在过去的几年里,我经手过不少基于USB Type-C接口的项目,从简单的充电器到复杂的扩展坞,一个绕不开的核心器件就是USB PD控制器。这东西就像整个Type-C生态系统的“交通警察”和“能源调度中心”,它不直接处理…

作者头像 李华
网站建设 2026/7/24 23:16:13

TI ADS8353/ADS7853 EVM-PDK评估套件:从硬件配置到软件分析的完整指南

1. 项目概述与核心价值拿到一款新的ADC芯片,尤其是像TI的ADS8353/ADS7853这样的高性能、双通道、同步采样SAR ADC,第一件事是什么?不是急着画原理图,也不是埋头写驱动代码。在十多年的硬件开发生涯里,我踩过最大的坑就…

作者头像 李华
网站建设 2026/7/24 23:15:16

AI Agent核心技术解析:感知、决策与持续学习

1. AI Agent的本质与进化脉络AI Agent这个概念最早可以追溯到上世纪50年代的图灵测试,但真正具备现代意义的智能体技术是在2010年后随着深度学习和强化学习的突破而兴起的。不同于传统程序,AI Agent最显著的特征是具备环境感知、自主决策和持续学习三大核…

作者头像 李华