出现的问题
    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. 服务器发送响应给客户端