FastAPI介绍
FastAPI两部分组成:
starlette负责web部分(Asyncio)
包含ASGI框架,能够实现构建异步服务器
Pydantic负责数据部分(类型提示)如下面代码所示:
from datetime import datetime from typing import Tuple from pydantic import BaseModel class Delivery(BaseModel): timestamp: datetime dimensions: Tuple[int, int] m = Delivery(timestamp='2020-01-02T03:04:05Z', dimensions=['10', '20']) print(repr(m.timestamp)) # > datetime.datetime(2020, 1, 2, 3, 4, 5, tzinfo=TzInfo(UTC)) print(m.dimensions) # > (10, 20)可以更好的处理数据
HTTP协议的结构详解
并且使用的http协议发送Get和Post请求的时候,需要设置好数据格式
# web应用程序 : 遵循http协议
import socket
sock = socket.socket()
sock.bind(("127.0.0.1", 1010))
sock.listen(5)
while 1:
# 服务端要实现先收再发
conn, addr = sock.accept() # 阻塞等待客户端连接
data = conn.recv(1024)
print("客户端发送的请求信息\n", data)
# 请求的时候不用管是因为浏览器已经帮我们已经封装好了
# 如果是这样的话,不符合http协议,服务端没有按照http协议的格式来发送数据给客户端
# conn.send(b"hello,world!")
# 换成下面这样的带有响应头的数据,就符合http协议了
conn.send(b"HTTP/1.1 200 OK\r\nhi\r\n\r\n<h1>hello,world!</h1>")
conn.close()
一般会给直接设置好
API接口
分离代表的是 职责 分离
前后端分离
前后端不分离(主流)
RESTful开发规范
RESTful是一种专门为了Web开发而定义的API接口的设计风格,尤其适用于前后端分离的模式中。
这种风格的理念认为后端开发任务是提供数据的,对外提供的是数据资源的访问接口。所以在定义接口的时候,客户端访问的URL路径就表示这种要操作的数据资源。
其目的主要是为了在请求的过程中对某个资源进行处理的时候,能够通过改变请求方式来实现在后端方面进行操作。
下图中定义了方式 👇
RESTful规范是一种通用的规范,不限制语言和框架。
get一般是查看
post一般是提交
...
初步开始
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
# 在def前面添加一个async就能实现异步
async def home():
return {"user_id": 1001}
需要区分的是,我们是利用web框架快速搭建起来的一个web应用程序
from fastapi import FastAPI
app = FastAPI()
# 进行路由映射、构建装饰器
# 路径操作装饰器
@app.get("/")
# 在def前面添加一个async就能实现异步
# 路径操作的函数
async def home():
return {"user_id": 10012}
@app.get("/shop")
async def shop():
return {"shop_id": "10012"}
文档的使用以及各个参数设置
在使用中,根url后添加 \docs 来进入文档界面
例如下面的代码:
from fastapi import FastAPI
app = FastAPI()
# 这里会有很多的参数,大部分都是应用在文档上的,/docs 可以实现在开发阶段测试的各个功能
@app.get("/",
tags=["主页"],
description="这是一个主页接口",
summary="主页接口",
deprecated=True)
def home():
return {"user_id": 1001}
路由的设置
users = APIRouter()
关键就在于对子路由进行一个实例化
实例化之后能够实现
http://127.0.0.1:1010/shop/food
http://127.0.0.1:1010/shop/clothes
等各个路径的耦合
查询参数
路径函数中声明不属于路径参数的其他函数参数时候,他们将被自动解释为”查询字符串“参数,就是url?之后要用&分割的key-value键值对
例如下面代码中的
@app02.get("/jobs")
async def job(jobs: str, a, ab):
return {
"msg": jobs
}
在上面的代码中的jobs即为路径参数也是查询参数,a和ab就只是查询参数
三个键值对是按照**&**作为分割符
当然是可以将键值对设置为不确认
例如下面的代码:
@app02.get("/jobs/{a}")
async def job(jobs: str, a=None, ab=None):
return {
"jobs": jobs,
"a": a,
"ab": ab
}
a因为是路径参数,所以即使设置为了None也是必须填写的
ab则为可填可不填
同时也需要注意的地方在于url路径上的区别
'http://127.0.0.1:1010/jobs/12?jobs=12'
union类型
在python3.6之后,增添了一个新的类型为union
使用方法为from typing import Union
示例:
from fastapi import APIRouter
from typing import Union
app02 = APIRouter()
@app02.get("/jobs/{a}")
async def job(jobs: Union[str, None], a=None, ab=None):
return {
"jobs": jobs,
"a": a,
"ab": ab
}
上面中对于Union
的使用为jobs既可以为Str,也可以为None
两种类型的使用都是正确的
Union[str, None] = None
在使用等于None 来让其默认值为 None
Optional是Union的一个简写,当数据结构中有可能为None和str的时候,可以用Optional来代替Union
Optional[str] 相当于 Union(str,None)
请求体数据
FastAPI基于Pydantic,其主要用来做类型强制检测,(校验数据),不符合类型要求就会抛出异常