目录
- 0.热身开始
- 1.路径参数
- 2.查询参数
- 3.请求正文
- 4.查询参数和字符串验证
- 5.路径参数和数值验证
- 6.请求体
- 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.响应-更改状态码
- 9.高级依赖
- 10.进阶的安全性
- 11.直接使用请求
- 12.先进的中间件
- 13.Peewee的关系型数据库
- 14.异步数据库
- 15.NoSQL[分布式/大数据]数据库
- 16.子应用-支架
- 17.代理背后
- 18.范本
- 19.GraphQL
- 20.Web套接字
- 21.事件:启动-关闭
- 22.自定义请求和APIRoute类
- 23.测试事件:启动和关闭
- 24.使用替代测试依赖项
- 25.测试数据库
- 26.异步测试
- 27.设置和环境变量
- 28.有条件的OpenAPI
- 29.拓展OpenAPI
- 30.包括WSGI-Flask,Django,其他
- 33.并发和异步/等待
- 34.部署方式
- 35.项目生成
- 36.替代方案,灵感和比较
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)
运行结果:
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)
结果:
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)
结果:
如果不按照顺序来,会有什么样的结果?
代码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)
结果:
(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)
结果:
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)
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)
结果:
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)
结果:
查询参数类型转换
多个路径和查询参数
必需查询参数
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)
结果:
导入 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)
结果:
使用模型
代码:
#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)
结果:
请求体 + 路径参数
代码:
#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)
结果:
请求体 + 路径参数 + 查询参数
代码:
#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)
结果:
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.响应状态码总结
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/