
1.Fastapi的优势1.异步任务 处理快 相比于同步任务异步任务可以同时处理多个任务 而同步只能将一个任务执行完毕后再去 相比之下异步任务的速度和效率更快2.核心用到async和await 一个都不能少async 是定义一个协程函数await是再协程函数中的挂起2.Fastapi的用法1.getuser_router.get(/select_user) async def get_user_list(): users await User.all() return {code: 200, data: users}user_router.get(/select_user) 括号中的是路由 可以自定义async def 方法名字() 中间可以传值 如id:int name:str 前面为要传的变量名 后面为类型app.get(/hello/{name}) async def say_hello(name: str): return {message: fHello {name}}如果是/{name}类型的 那么方法中传的数据变量名要与路径中的变量名相等url……/hello/1/ 路由就相等这个样子 path 可以为变量加约束 如(name: strPath( ..., titleName, min_length1, max_length10, exampleMike )):··· 是必填 也可以为None 可以为空的意思 如果是必填不填就会出现下面场景title 就是我们的提示min_legth 最小长度为1 max_length 最大的长度 example 是示例 这样就算自动校验的方法user_router.get(/select_user) async def get_user_list(): users await User.all() return {code: 200, data: users}这个就是查询 User中的所有内容 前面要挂载 await 再django中是 models.User.object.all()区别就是去掉models 和 object 在前面加上 await如果需要条件查询我们如下:task_router.get(/) async def get_task_list( status: int None, keyword: str None, sort_by: str None, ): query Task.all() if status is not None: query query.filter(statusstatus) if keyword: query query.filter(Q(title__containskeyword)) if sort_by: query query.order_by(sort_by) task_list await query return {code: 200, data: task_list}我们将条件加入 都作为选填 None 这样我们如果不填就是查询所有内容我们定义queryTask.all 是查询Task中的所有内容 赋值给 query下面判断如果我们输入了内容 就filter进行查询然后重新赋值给query最后是sort_by 用哪个字段排序 await query 赋值给task_list 输出2.post实现我们添加是要写一个请求体class TaskCreateRequest(BaseModel): user_id:int Field( None, title用户ID, description用户ID, example1 ) title : str description : str status : int priority : int due_date : str请求体我们新建文件 schemas 然后在下面新建.py 在里面新建请求体 请求体中的字段要与模型中的字端对应 并且后面携带类型 也可以在后加约束 相当于校验比如 第一个user_id 第一个为选填 如果是必填我们就写··· 如果不是我们就写Nonetitle是标题 description就是提示 example就是示例 跟我们前面写的是一样的然后是post添加 我们调用这个 TaskCreateRequest 请求体task_router.post(/add) async def create_task(task_data: TaskCreateRequest): task await Task.create(**task_data.dict()) return {code: 200,msg:创建成功,data: task}我们传的参数 task_data: TaskCreateRequest接受前端传的内容 然后走我们的请求体判断task await Task.create(**task_data.dict())将 task_data.dict 转化为字典 添加到Task中 并且挂载一个 await下面就是添加的请求体 基本都是必填的 也可以为选填3.putput和post一样都需要请求体 但是不一样的是 put的请求体 可以选填 而且我们可以传空值class TaskUpdateRequest(BaseModel): user_id:int Field( None, title用户ID, description用户ID, example1 ) title : strField( None, title任务标题, description任务标题, example任务标题 ) description : strField( None, title任务详情, description任务详情, example任务详情 ) status : intField( None, title任务状态, description任务状态, example0 ) priority : intField( None, title任务优先级, description任务优先级, example1 ) due_date : strField( None, title任务截止时间, description任务截止时间, example2023-01-01 00:00:00 )把所有的请求体都设置为可以为None就是我们前端可以不修改这个字段task_router.put(/update/{id}) async def update_task(id: int, task_data: TaskUpdateRequest): task await Task.filter(idid).first() if not task: return {code: 404, message: 任务不存在} update_dict task_data.model_dump(exclude_unsetTrue) await task.update_from_dict(update_dict) await task.save() return {code: 200, message: 更新成功, data: task}我们传了一个id 是我们要修改任务的id 在任务列表中查找查找后 我们 task_data.model_dump(exclude_unsetTrue)将前端传入的数据 变为一个字典 只传不为None的值 这样就不会报错了 然后用update_form_dict 进行修改就可以了如果我们不写(exclude_unsetTrue) 则会一直显示我们传的值不够4.delete删除只需要我们在url中传一个id就可以了task_router.delete(/delete/{id}) async def delete_task(id: int): task await Task.filter(idid).first() if not task: return {code: 404, message: 任务不存在} await task.delete() return {code: 200, message: 删除成功}在task中查找id 然后直接调用方法 delete就可以删除了 前面要加一个await挂载才可以使用总结今天学习了fastapi 的基本使用方法 以及models的创建 和挂载 以及什么是请求体 跟django的方法类似 async和await必须同时使用 django的方法现在改为前面加上await多文件下的方法 如models routers schemas 每个文件下的py不一样 要严格分开以及数据库的连接 迁移 数据查询 添加 修改 删除pip install aerichaerich init -t day01.config.TORTOISE_ORMaerich init-db严格按照要求 每个的配置不一样 如果要生成token 登陆验证 我们还需要加入jwt 生成前端页面要加上我们的跨域挂载app.add_middleware( CORSMiddleware, allow_origins[*], allow_credentialsTrue, allow_methods[*], allow_headers[*], )book_project/ ├── main.py # FastAPI应用主入口 │ ├── requirements.txt # Python依赖包 │ └── app/ # 应用核心代码 ├── __init__.py │ ├── config.py # 数据库配置文件 │ ├── models/ # 数据模型层 │ ├── __init__.py │ ├── models.py # 相关模型 │ ├── routers/ # API路由层 │ ├── __init__.py │ └── work.py # 相关API │ └── schemas/ # 数据验证层 (Pydantic) ├── __init__.py └── work.py # 请求/响应模型文件夹结构