# fastapi 操作常用方法
* 激活虚拟环境,升级 pip【项目只需要执行一次,后续不需要了】
0、D:\Python\Python313\python.exe -m venv venv
1、venv\Scripts\activate
2、python -m pip install --upgrade pip【进入虚拟环境,升级pip】
* 执行新增的依赖【使用 pip freeze 命令可以把 requirements.txt 内所有依赖显示当前已经安装的版本号都展示出来】
pip install -r requirements.txt
* 初始化数据库信息:
aerich init -t 项目名.main.TORTOISE_ORM # 初始化 aerich aerich init-db # 初始化迁移环境
* 每次新增表或者修改字段操作生成新的表或者更新字段:
aerich migrate --name add_xx_table # 创建新的表【add_xx_table是备注信息】
aerich upgrade # 迁移脚本
* 脚本版本回滚:
aerich downgrade # 回滚脚本 aerich history # 查看历史
* 新建一个模型注意事项:
1.models 中,__init__.py 中记得要添加新的类名
1.models 中,__init__.py 中记得要添加新的类名
* 定义了绝对路径,本地开发和服务器上,需要注意定义绝对路径
========================================================================
* 将一个模型类序列化成 json 数据的方法
account = await Account.filter(xx=xx).first() json = dict(account)
* get请求参数传递方式:
方式一:http://127.0.0.1:8001/user/find_one_user?user_id=1&name=1 @router.get("/find_one_user") async def find_one_user(user_id: int,name:str): 方式二:http://127.0.0.1:8001/user/find_one_user/1/1 @router.get("/find_one_user/{user_id}/{name}") async def find_one_user(user_id: int,name:str): 方式三:http://127.0.0.1:8001/user/find_one_user?user_id=1&name=1
@router.get("/find_one_user")
async def find_one_user(request: Request):
user_id = request.query_params.get('user_id')
* 从 db 查询出来的数据,统计长度的两种方式:
# 先使用await,再使用 len,是在内存中统计长度 accounts = await Account.all() number = len(accounts) # 后使用await,再使用 .count(),是在数据库层面统计长度 accounts = Account.all() number = await accounts.count()
* 依赖注入,在方法执行前执行:account: Account = Depends(login_pre_check) 可以在 list 方法执行前,先执行 login_pre_check 方法
# 查詢列表 @router.post('/list') async def list(request: Request, param: RequestParam, account: Account = Depends(login_pre_check)): try: accounts = await Account.all() return Result.success_list(accounts) except Exception as e: logger.info('异常为:',exc_info=True) return Result.error(e)
* 装饰器(类似 java 的自定义注解)
# 是否登錄裝飾器校驗 def is_login(func): @wraps(func) async def wrapper(request: Request, *args, **kwargs): # 调用登录验证方法 token = request.headers.get("Authorization") account = await login_pre_check(token) # 调用原始函数 response = await func(request, *args, **kwargs) return response return wrapper
使用时,需要放到路由下面,顺序不对,不生效

* 使用 pydantic_model_creator 序列化模型
from tortoise.contrib.pydantic import pydantic_model_creator @router.post('/list') @is_login async def list(request: Request): member = await login_member(request) try: reserve_manages = member.member_reserve_manage.all().select_related("user", "serve_project","workman").order_by('-create_at') # 創建序列化(使用序列化器則以上查詢不能加await,需要在.from_queryset時加await) ReserveManagePydantic = pydantic_model_creator(ReserveManage, exclude=( "member", "user.password", "user.token", "serve_project.member", "workman.member", "workman.workman_worktime" ) ) bean = await ReserveManagePydantic.from_queryset(reserve_manages) result = fields_none_list(bean) return Result.success(result) except Exception as e: logger.info('异常为:',exc_info=True) return Result.error(str(e))

浙公网安备 33010602011771号