# 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 中记得要添加新的类名
* 定义了绝对路径,本地开发和服务器上,需要注意定义绝对路径
========================================================================
* 将一个模型类序列化成 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))

 

posted @ 2025-02-04 12:28  雪化山河  阅读(45)  评论(0)    收藏  举报