出现的问题
1. token认证
2. home.html 页面上读取不到数据库数据
fastapi
loc报错的位置,msg报错的信息,type报错的类型,
fastapi类型与flask写法相似,知识点官网有实例,编码精简,
starlette,pydantic
在参数中定义变量类型,比如 def people(name : str, age: int)
pydantic 是一个基于python类型提示来定义数据验证,序列化和文档
(使用json模式)库,前后端协商好规范,
starlette 轻量级ASGI框架/工具包,是构建高性能Asyncio服务的理想选择,
基于starlette,使用另外type提示,
ASGI WSGI 指的是一种规范,针对python apache django 之间的一种规范,
uvicorn , Hypercorn, Daphne 是属于ASGI服务的,相当于ngix服务,异步的
python框架
uWSGI ,Gunicorn(异步多进程) 是属于 WSGI , 可以通过pip安装,部署python同步web
应用的,django,flask用的最多的就是这两个,
去github上下载requirements.txt
创建一个文件requirements.txt,复制github上面的代码过来
先安装virtualenv (pip install virtualenv)
进入fastapi-tutorial路径
输入命令 virtualenv venv
创建完毕venv环境
cd venv
cd Scripts
activate.bat
cd ..
cd ..
pip install requirements.txt
安装完毕后
创建python文件
C:\Users\EDY\PycharmProject
s\fastapi\fastapi-tutorial\venv\Scripts\python.exe
pydantic可以规范python代码
下载pydantic 插件,规范定义
校验失败的处理
从pydantic中导入ValidationError,使报错信息更清楚
{“id”: 123, ‘signup_ts’: “2022-12-22 12:22”,”friends” : [1,2,”3”]}
pydantic官方文档
https://pydantic-docs.helpmanual.io/usage/types/#datetime-types
uvicron有两种运行方式
第一种是代码式
import uvicorn
uvicorn.run(app, host=”127.0.0.1”, port=8000)
第二种是命令式
uvicorn 模块名:app —port=8000 —host=127.0.0.1
path 路径参数,query查询参数,必填项
# fastapi 交互文档 127.0.0.1:8000/docs
路径参数的解析验证,路径参数的类型、错误校验,数据转换,参数的别名
在api文档中传参效果
run文件是这个项目的主文件,run运行之后,这个项目就运行起来了
创建项目fastapi-tutorial, 外层创建run.py[运行整个项目],
再创建两个文件包,coronavirus、tutorial,tutorial中创建6个
应用[格式是:from fastapi import APIR outer
app04 = APIRouter()
app0 = APIRouter() ],再把app放在init文件中,预备给后续调用,
F77 要使用缩写来做 逻辑判断:
.GE. Greater or Equal ; 大于等于;
.GT. -:Greater Than; 大于
.LE. : Less or Equal; 小于等于
.LT. Less Than; 小于
.EQ. Equal ; 等于
.NQ. Not Equal 不等于
# ①校验的话,使用pydatic 定义请求体,对字段校验时使用pydantic中的Field,
# ② 使用路径参数时,要对数据进行校验,要使用fastapi中的 Path这个类
# ③ 对查询参数校验是使用fastapi中的Query这个类
在postman中headers选项中添加 键Cookie[注意大写],值cookie_id=xxx,发送请求,获取到设置的cookie
Header(None,convert_underscores=True)) convert_underscores可以转换下划线为横杠
# response_model 文档中直译为 path operation路径操作。。[响应模型
# response_model_exclude_unset 默认值不包含在响应中,仅包含实际的值
使用并集的方式 typing中的Union
函数中del 删掉函数的属性
在response_model中有include 必须包含某个字段,exclude 必须排除某字段
response_model=List[任意模型名] 返回符合模型数据体的数据
可以使用fastapi中的status,来设置状态码int类型
表单数据处理,从fastapi中导入form
文件类型是字节 bytes
file: bytes=File(…) 上传多个文件在bytes前面加上List
上传大文件[图片视频] 使用 fastapi中的UploadFile,小文件使用File方法
UploadFile 优势: 1.文件存储在内存中,使用的内存达到阈值后,被保存在磁盘中,
2.适合图片视频,3.可以获取上传的文件的元数据,如文件名、创建时间等等
4.有文件对象的异步接口
5.上传的文件是python文件对象,可以使用write(), read(),seek(),close()操作
await 等待一个进程结束
# mount 表示将某个目录中一个完全独立的应用挂载过来,这个不会在API交互文档中显示出来
路径操作配置,
更改接口响应描述[response_description],对接口的描述[summary]
deprecated= True 表示这个接口在这个版本被废弃了,颜色置灰加删除线,但是还能使用,
reponse_model 响应模型,status_code 状态码,使用status方法,
tags 产生多条同样的接口,只是名字不同
fastapi中HTTPException是默认异常处理,可以更改这个方法,那么改的话在主程序中修改
重写的方法是调用以下3个类
from fastapi.exceptions import RequestValidationError
from fastapi.responses import PlainTextResponse
from starlette.exceptions import HTTPException as StarletteHTTPException
@app.exception_handler(StarletteHTTPException) # 重写HTTPException异常处理器
“””依赖注入系统 “”” # 为保证代码成功运行,先导入或生命其所需要的”依赖“,如子函数、数据库连接等
# 把公共的子函数就叫做依赖 共享数据库的连接 增强安全、认证、角色管理、管理员只用它的资源、 items 资源
# 兼容所有关系型数据库,支撑NoSQL数据库
# 第三方的包和API
# 认证和授权系统
# 响应数据注入系统
创建公共函数
然后依赖的话,依赖使用fastapi中的Depends方法,把要依赖的参数写在Depends中
公共函数可以在async中调用,也可以在普通的函数中调用,依赖是不区分异步函数和同步函数的
可以在异步的函数中,调用同步的依赖,也可以在同步的函数中,调用异步的依赖
use_cache 当多个依赖有共同的一个子依赖时,每次request请求只会调用子依赖一次,
多次调用将从缓存中获取
路径操作中调用依赖,加Header(…) 管理器,必传,可以设置多个依赖
在@app. 写路由时,填写在路径中,Dependencies=[Depends(1),Depends(2)…]
全局依赖
在fastapi或者APIRouter中属性dependencies=[Depends(依赖1),Depends(依赖2)…]
“”” OAuth2密码模式和FASTAPI 的OAuth2PasswordBearer”””
# 让用户获取token的接口
# OAuth2PasswordBearer 是接收url作为参数的一个类,客户端想该url发送用户名和密码参数,获取token
#OAuth2PasswordBearer 并不创建相对应的url路径操作,只是会指明客户端来请求token的url地址
# 收到请求时,fastapi会检查请求的Authorization头信息,如果没找到这个头信息,或者头信息的内容不是Bearer token,返回401状态码,UNAURHORIZED
oauth2_schema = OAuth2PasswordBearer(tokenUrl=”/chapter06/token”) # 向这个地址请求来获取token
@app06.get(“/oauth2_password_bearer”) # 需要用到fastapi的依赖注入系统 Depends,引用上面的schema作为依赖,
async def oauth2_password_bearer(token: str = Depends(oauth2_schema)):
return {“token”:token} # 把接收到的token返回
*基于JSON Web Tokens的认证
分六步
1.用户登录[账号、密码]
2.服务器创建JWT密钥
3.服务器把JEWT返回给浏览器
4.浏览器发送JWT给认证的请求头里面Authorization Header
5. 服务器检查JWT,验证签名,获取用户信息
6. 服务器发送响应给客户端