FastAPI使用手册

目录

0.热身开始

1.理解重构是什么

遇到一个问题,先用最简单粗暴的方法来解决,然后分析这个方法的优缺点,寻找更优秀的解决方案,通过这样的不断重构,渐进式的加入对知识的理解。

2.其他重要的东西

(1)平台总是多变的,技术思维总是相通的。
(2)在做的过程中遇到问题,想办法解决问题【自己/谷歌/同事朋友/GitHub的Issue】,通过搜集资料,学习与这个问题相关的知识点,最后把这些知识点进行总结归纳,形成自己的知识体系。
(3)写代码有时候要有摧残不死的勇气:先解决再学习,管他三七二十一。
(4)不理解也没关系,遇到类似的问题和功能时,你知道怎么去解决即可。在编程中,我们不理解的东西太多了,谁能保证我们做过的项目,每一个细节都理解的清清楚楚明明白白呢?有时候记住怎么去做,比为什么这么做更加重要。搞清楚只是一个相对的概念。到底理解到什么程度才算理解清楚并没有一个明确的标准。深入到什么程度才算深入学习?也没有一个明确的标准。因此,有选择性的学习原理,把更多的时间精力放在解决问题上才是一个明确的正确的选择。
(5)亲手敲每一行代码,不要复制。笨方法学东西。
(6)在做一个demo/项目的时候,当遇到你不熟悉的知识体系时,没关系,先写上代码,实现这个功能。当以后有了更丰富的经验再回过头来看看这些知识点即可。做到即使不懂每个知识点,也要先完成一个demo/项目。做中学。
(7)7天完成此教程。
好,现在可以开始了~我已经做好准备了。
(8)有些东西,如websocket,按照是什么,怎么用,解决了什么问题【产生背景是什么?为什么要有它?】的思路组织信息。
是什么的问题去百度词条+*+官方文档/类似的官方文档+书籍,基本上能解决上述问题~

1.路径参数

代码1:

#encoding:utf-8
from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{canshu_id}")
async def read_item(canshu_id):
    return {"canshu_id":canshu_id}

if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app,host="127.0.0.1",port=8080)

运行结果:
FastAPI使用手册
1.路径参数是{canshu_id}的形式,有点像Python的f-string的格式化输入/输出。
2.在不声明路径参数的数据类型的时候,看截图默认是str类型。如果是其他类型如整型会自动转化为str类型。

代码2:

#encoding:utf-8
from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{item_id}")
async def read_item(item_id:int):
    return {"item_id":item_id}

if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app,host="127.0.0.1",port=8080)

结果:
FastAPI使用手册
1.声明路径参数是啥类型就传啥类型,如果传错了会有错误检查结果返回给你看。关于类型声明这一块,FastAPI会自动完成数据校验,这非常方便开发与调试。

(1)路径操作-路径固定情况-按顺序匹配

代码3:

#encoding:utf-8
from fastapi import FastAPI

app = FastAPI()


@app.get("/users/me")
async def read_user_me():
    return {"user_id":"the current user"}


@app.get("/users/{user_id}")
async def read_user(user_id:str):
    return {"user_id":user_id}

if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app,host="127.0.0.1",port=8080)

结果:

FastAPI使用手册
如果不按照顺序来,会有什么样的结果?
代码4:

#encoding:utf-8
from fastapi import FastAPI

app = FastAPI()


@app.get("/users/{user_id}")
async def read_user(user_id:str):
    return {"user_id":user_id}
#这是固定路径
@app.get("/users/me")
async def read_user_me():
    return {"user_id":"the current user"}

if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app,host="127.0.0.1",port=8080)

结果:
FastAPI使用手册

(2)预定义值-Enum

创建一个 Enum 类。
声明路径参数
代码5:

#encoding:utf-8
from enum import Enum
from fastapi import FastAPI


class ModelName(str,Enum):
    name="yjg"
    blog="代码写注释"
    url="YJG7D314"


app = FastAPI()


@app.get("/models/{model_name}")
#model_name的类型是ModelName这个类。一切皆对象。type()
async def get_model(model_name:ModelName):
    if model_name == ModelName.name:
        return {"model_name":model_name,"msg":"****-代码写注释"}
    if model_name.value == "YJG7D314":
        return {"model_name":model_name,"msg":"url-代码写注释"}
    return {"model_name":model_name,"msg":"只是为了好玩~"}

if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app,host="127.0.0.1",port=8080)

结果:
FastAPI使用手册
1.通过预定义值-Enum操作,路径参数变化的可能性就被穷举【固定住】了,是变量的值。

(3)路径转换器

#encoding:utf-8
from fastapi import FastAPI

app = FastAPI()


@app.get("/files/{file_path:path}")
async def read_file(file_path:str):
    return {"file_path":file_path}

if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app,host="127.0.0.1",port=8080)

FastAPI使用手册

2.查询参数

默认值

代码:

#encoding:utf-8
from fastapi import FastAPI

app = FastAPI()
fake_items_db = [{"item_name": "Python"}, {"item_name": "Go"}, {"item_name": "Java"}]

@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
    #控制查询,展示的个数
    return fake_items_db[skip : skip + limit]

if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app,host="127.0.0.1",port=8080)

结果:
FastAPI使用手册
1.查询参数有默认值,可以传值改变它的默认值。

可选参数

代码:

#encoding:utf-8
from typing import Optional
from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{item_id}")
async def read_item(item_id:str,q:Optional[str] = None):
    if q:
        return {"item_id":item_id,"q":q}
    return {"item_id":item_id}

if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app,host="127.0.0.1",port=8080)

结果:
FastAPI使用手册

查询参数类型转换

多个路径和查询参数

必需查询参数

Optional 类型声明

3.请求正文

4.查询参数和字符串验证

额外的校验

代码:

#encoding:utf-8
from typing import Optional

from fastapi import FastAPI,Query

app = FastAPI()


@app.get("/items/")
async def read_item(q:Optional[str] = Query(None,max_length=50)):
    results = {"items":[{"item_id":"aaa"},{"item_id":"bbb"}]}
    if q:
        results.update({"q": q})
    return results

if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app,host="127.0.0.1",port=8080)

结果:
FastAPI使用手册

导入 Query

使用 Query 作为默认值

添加更多校验

添加正则表达式

默认值

声明为必需参数

查询参数列表 / 多个值

具有默认值的查询参数列表 / 多个值

使用 list

声明更多元数据

别名参数

弃用参数

总结

5.路径参数和数值验证

6.请求体

导入 Pydantic 的 BaseModel

代码:

#encoding:utf-8
from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel


class Item(BaseModel):
    name:str
    description:Optional[str] = None
    price:float
    tax:Optional[float] = None

app = FastAPI()

@app.post("/items/")
async def create_item(item:Item):
    return item

if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app,host="127.0.0.1",port=8080)

结果:
FastAPI使用手册

使用模型

代码:

#encoding:utf-8
from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel


class Item(BaseModel):
    name:str
    description:Optional[str] = None
    price:float
    tax:Optional[float] = None

app = FastAPI()
@app.post("/items/")
async def create_item(item:Item):
    item_dict = item.dict()
    # print(type(item_dict))
    # <class 'dict'>说明类的实例.dict()方法实现的效果就是将实例转化为字典。

    if item.tax:
        a = 1
        price_with_tax = item.price + item.tax
        item_dict.update({"price_with_tax":price_with_tax})
        item_dict.update({a:price_with_tax})
        # dict()---a =1 作为key,说明在给字典赋值时候key的类型没有限制【前提是声明变量再使用变量名即可,Python默认字符串可以不需要声明直接使用】,但是返回的字典key是字符串,value可以是任意类型。
    return item_dict

if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app,host="127.0.0.1",port=8080)

结果:
FastAPI使用手册

请求体 + 路径参数

代码:

#encoding:utf-8
from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel


class Item(BaseModel):
    name:str
    description:Optional[str] = None
    price:float
    tax:Optional[float] = None

app = FastAPI()

@app.put("/items/{item_id}")
async def create_item(item_id:int,item:Item):
    return {"item_id":item_id,**item.dict()}

if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app,host="127.0.0.1",port=8080)

结果:
FastAPI使用手册

请求体 + 路径参数 + 查询参数

代码:

#encoding:utf-8
from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel


class Item(BaseModel):
    name:str
    description:Optional[str] = None
    price:float
    tax:Optional[float] = None

app = FastAPI()

@app.put("/items/{item_id}")
async def create_item(item_id:int,item:Item,q:Optional[str] = None):
    #将请求体声明为参数,添加到路径操作中
    #步骤:导入BaseModel-创建数据模型-声明为参数-请求体
    result = {"item_id":item_id,**item.dict()}
    if q:
        result.update({"q":q})
    return result

if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app,host="127.0.0.1",port=8080)

结果:
FastAPI使用手册

7.请求头

8.请求头-嵌套模型

9.模式额外事例

10.额外的数据类型

11.Cookie参数

12.标头参数

13.响应模型

14.额外型号

15.表格数据

16.请求文件

17.获取表格和文件

18.处理错误

19.路径操作配置

20.JSON兼容编码器

21.依存关系

22.安全

23.中间件

24.CORS

25.SQL关系数据库

26.更大的应用程序-多个文件

27.后台任务

28.元数据和文档地址

29.静态文件

30.测试

31.调试

32.进阶者秘籍

1.路径操作高级配置

2.附加状态码

3.直接返回响应

4.自定义响应——HTML+流+文件等等

5.OpenAPI的其他响应

6.响应Cookie

7.响应标题

8.响应-更改状态码

1.响应状态码总结

FastAPI使用手册1xx:消息 2xx:成功 3消息:重定向 4xx:请求错误 5xx:服务器错误

尝试203,发现是非空验证

9.高级依赖

10.进阶的安全性

11.直接使用请求

12.先进的中间件

13.Peewee的关系型数据库

14.异步数据库

15.NoSQL[分布式/大数据]数据库

16.子应用-支架

17.代理背后

18.范本

19.GraphQL

20.Web套接字

0.demo-实现socket的增删改查

1

action="" 当前目录,提交给自己

2.问题

WARNING: Unsupported upgrade request.

解决步骤:
poetry remove uvicorn
poetry add uvicorn[standard]
搞定!

INFO: 127.0.0.1:50142 - “GET /favicon.ico HTTP/1.1” 404 Not Found

在HTML页面中的标签中添加入下代码:

3.版本

通知用户完成了什么操作。比轮询好。直接将操作响应信息推送给用户。
单人聊天—》多人聊天
类似的UNIX SOCKET。
https://www.goeasy.io/

21.事件:启动-关闭

22.自定义请求和APIRoute类

23.测试事件:启动和关闭

24.使用替代测试依赖项

25.测试数据库

26.异步测试

27.设置和环境变量

28.有条件的OpenAPI

29.拓展OpenAPI

30.包括WSGI-Flask,Django,其他

33.并发和异步/等待

34.部署方式

35.项目生成

36.替代方案,灵感和比较

上一篇:【FastAPI 学习一】配置文件


下一篇:FastAPI 进阶知识(七) 在Request中存储附加信息