FastAPI的初步学习—Day01 一、FastAPI的请求体与HTTP方法1、请求体定义HTTP 请求的「正文部分」专门用于传递大量、复杂、结构化数据如 JSON、表单数据。优势比普通的路径参数和查询参数简洁高效传输数据容量大格式灵活更加安全。核心依赖pip install pydantic 导入依赖中的BaseModel方法from pydantic import BaseModel模型示例fromtortoiseimportfieldsfromtortoise.modelsimportModelclassUser(Model):idfields.IntField(pkTrue)namefields.CharField(max_length20)agefields.IntField()emailfields.CharField(max_length50)phonefields.CharField(max_length11,nullTrue,blankTrue)classMeta:tableuser# 指定表名def__str__(self):returnself.name2、HTTP方法get方法:查询资源禁止使用请求体post方法:创建资源必用请求体put方法修改资源必用请求体patch方法更新部分资源必用请求体二、Tortoise-ORM集成11、什么是ORM定义ORM全称为Object-Relational Mapping对象关系映射它的核心思想是用 Python 类来代表数据库中的表用类的实例来代表表中的一行记录。2、ORM的优势面向对象用 Python 代码替代 SQL 语句更符合编程思维。安全性自动进行参数化查询防止 SQL 注入攻击。跨数据库同一套代码可以无缝切换 SQLite、PostgreSQL、MySQL 等数据库。关系管理自动处理表与表之间的外键、多对多等关系。可维护性表结构集中定义在模型类中修改和管理更方便。3、Tortoise-ORM的特点原生异步基于 asyncio 构建所有数据库操作都是异步的不会阻塞事件循环。Django 风格的 API如果你用过 Django ORM会发现语法非常熟悉上手极快。轻量级专注于核心功能没有冗余的抽象层性能出色。完整的关系支持支持外键、一对一、多对多等所有常见关系类型。内置 Pydantic 集成可以通过 pydantic_model_creator 自动从 Tortoise 模型生成 Pydantic 模型无缝对接 FastAPI 的请求/响应校验。4、Tortoise-ORM环境配置核心依赖pip install tortoise-ormMySQL 异步驱动pip install asyncmy推荐 或者 pip install aiomysqlAerich 迁移工具pip install aerichFastAPI 和 Uvicornpip install fastapi “uvicorn[standard]”5、FastAPI配置以及跨域数据库配置config.py# app/config.py 数据库配置文件 这个文件定义了 Tortoise-ORM 连接 MySQL 数据库所需的所有配置信息 # TORTOISE_ORM 是 Tortoise-ORM 规定的配置字典变量名# 后面用 register_tortoise 或 Aerich 时都会引用这个字典TORTOISE_ORM{# 1. 连接配置 —— 定义数据库连接信息connections:{# default 是默认连接的名字必须有一个 defaultdefault:{# engine指定数据库后端引擎MySQL 使用 tortoise.backends.mysqlengine:tortoise.backends.mysql,# credentials数据库连接凭证包含主机、端口、用户名、密码等credentials:{host:127.0.0.1,# MySQL 服务器地址port:3306,# MySQL 端口默认 3306user:root,# 数据库用户名password:root,# 数据库密码请根据实际情况修改database:mysql0719,# 数据库名称minsize:1,# 连接池最小连接数maxsize:5,# 连接池最大连接数charset:utf8mb4,# 字符集支持 emojiecho:True# 是否打印 SQL 语句开发环境建议开启}}},# 2. 应用配置 —— 指定模型所在的模块apps:{# models 是应用的名字可以自定义但 Aerich 需要使用这个名字models:{# models 列表指定包含 Tortoise 模型类的 Python 模块路径# aerich.models 是 Aerich 的内置模型用于记录迁移历史必须包含models:[app.models,aerich.models],# default_connection指定这个应用使用哪个数据库连接default_connection:default,}},# 3. 时区配置use_tz:False,# 是否使用时区timezone:Asia/Shanghai# 时区设置}跨域main.pyfromfastapiimportFastAPIfromtortoise.contrib.fastapiimportregister_tortoisefromapp.routers.user_apiimportuser_routerfromapp.configimportTORTOISE_ORMfromfastapi.middleware.corsimportCORSMiddleware appFastAPI()register_tortoise(app,configTORTOISE_ORM,generate_schemasTrue,add_exception_handlersTrue)app.include_router(user_router)app.get(/)asyncdefroot():return{message:Hello World}app.get(/hello/{name})asyncdefsay_hello(name:str):return{message:fHello{name}}origins[http://localhost,http://localhost:8080,# Vue/React前端地址http://127.0.0.1:3000,http://localhost:5173,# 线上域名 https://xxx.com]# 添加跨域中间件app.add_middleware(CORSMiddleware,allow_originsorigins,# 允许的域名allow_credentialsTrue,# 允许携带cookie、认证头allow_methods[*],# 允许所有请求方法 GET/POST/PUT/DELETE...allow_headers[*],# 允许所有请求头)6、Tortoise-ORM 模型定义fromtortoiseimportfieldsfromtortoise.modelsimportModelclassUser(Model):idfields.IntField(pkTrue)namefields.CharField(max_length20)agefields.IntField()emailfields.CharField(max_length50)phonefields.CharField(max_length11,nullTrue,blankTrue)classMeta:tableuser# 指定表名def__str__(self):returnself.name7、迁移命令Aerich 初始化aerich init -t app.config.TORTOISE_ORM TORTOISE_ORM为数据库配置文件config.py中定义的数据库链接初始化数据库创建初始迁移aerich init-db以上两条命令是第一次迁移时使用的命令生成迁移文件aerich migrate --name add_author_models运行迁移aerich upgrade8、创建并注册路由创建在user文件中使用APIRouter方法创建路由fromfastapiimportAPIRouter user_routerAPIRouter(prefix/user,tags[用户管理])注册在main.py中使用include_router方法注册路由。fromapp.routers.user_apiimportuser_router app.include_router(user_router)9、HTTP方法的使用以及代码模型定义schemas/user.pyfrompydanticimportBaseModel,FieldclassUserCreate(BaseModel):name:strField(...,description用户名,max_length20,min_length2)age:strField(...,description年龄)email:strField(...,description邮箱,pattern^[a-zA-Z0-9_.-][a-zA-Z0-9-]\\.[a-zA-Z0-9-.]$)phone:strField(None,description手机号,max_length11,min_length11,pattern^\d{11}$)classUserUpdate(BaseModel):name:strField(None,description用户名,max_length20,min_length2)age:strField(None,description年龄)email:strField(None,description邮箱,pattern^[a-zA-Z0-9_.-][a-zA-Z0-9-]\\.[a-zA-Z0-9-.]$)phone:strField(None,description手机号,max_length11,min_length11,pattern^\d{11}$)接口代码routers/uer.pyfromfastapiimportAPIRouterfromapp.models.userimportUserfromapp.schemas.userimportUserCreate,UserUpdate user_routerAPIRouter(prefix/user,tags[用户管理])user_router.get(/all,summary查询所有用户,description查询所有用户信息)asyncdefuserall():userawaitUser.all()return{msg:查询成功,data:user,code:200}user_router.get(/all/{id},summary查询用户,description根据ID查询用户)asyncdefuserone(id:int):userawaitUser.get(idid)return{msg:查询成功,data:user,code:200}user_router.post(/add,summary添加用户,description添加用户)asyncdefuseradd(user:UserCreate):user_adduser.dict()awaitUser.create(**user_add)return{msg:添加成功,data:user,code:200}user_router.delete(/delete/{id},summary删除用户,description根据ID删除用户)asyncdefuserdelete(id:int):userawaitUser.get(idid)awaituser.delete()return{msg:删除成功,code:200}user_router.put(/update/{id},summary更新用户,description根据ID更新用户)asyncdefuserupdate(id:int,user:UserUpdate):user_updateuser.dict(exclude_unsetTrue)awaitUser.filter(idid).update(**user_update)return{msg:更新成功,data:user,code:200}