自底向上分析FastAPI框架

WebSocket

WebSocket是Web浏览器和Web服务器之间的全双工通信标准。它支持由服务器向客户端推送数据的推送功能,并且能够减少通信量。为了实现WebSocket通信,在HTTP连接建立之后,需要完成一次握手的步骤。

ASGI

ASGI的全称是异步服务器网关接口,它是一个介于Web服务器和Web应用程序之间的标准接口。与ASGI相关的另一个重要概念是WSGI,也就是Web服务器网关接口。WSGI是基于HTTP协议模式开发的,不支持WebSocket。ASGI是WSGI的扩展,在原有基础上增加了许多新的特性,比如支持HTTP2,WebSocket和异步通信等。

Starlette

Starlette是一个支持ASGI的异步框架,它可以用于构建Web应用程序。在以下示例中,我们通过Starlette类构建了一个应用(app),并注册了主页(homepage)的路由。

1
2
3
4
5
6
7
8
9
10
11
12
from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route


async def homepage(request):
return JSONResponse({'hello': 'world'})


app = Starlette(debug=True, routes=[
Route('/', homepage),
])

Uvicorn

Uvicorn是一个快速的ASGI服务器,基于uvloop(用于处理事件循环)和httptools(用于处理HTTP协议)构建。通过它,前端可以与后台的应用程序进行交互。Uvicorn要求应用程序实现一个包含三个参数(连接信息scope,接收信道receive,发送信道send)的函数或示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
async def app(scope, receive, send):
assert scope['type'] == 'http'
await send({
'type': 'http.response.start',
'status': 200,
'headers': [
[b'content-type', b'text/plain'],
]
})
await send({
'type': 'http.response.body',
'body': b'Hello, world!',
})

if __name__ == "__main__":
uvicorn.run("main:app", port=5000, log_level="info")

可以通过以下命令运行Uvicorn:

1
uvicorn main:app

Pydantic

Pydantic是一个Python库。用户只需定义一个类,用Python的类型提示标注其字段,Pydantic就会自动处理验证和序列化。
在以下示例中,我们将输入数据传递给一个Order类,如果数据无效,Pydantic将自动抛出一个详细的错误,指出哪个字段无效以及为什么。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from pydantic import BaseModel, Field

class Order(BaseModel):
product_id: int = Field(..., gt=0)
quantity: int = Field(..., gt=0, le=100)
payment_method: str = Field(..., regex="^(credit_card|paypal)$")

order_data = {
"product_id": 1,
"quantity": 50,
"payment_method": "credit_card"
}

try:
order = Order(**order_data)
except ValidationError as e:
print(e.json())

我们还可以将order序列化为字典或者JSON格式。

1
2
order_dict = order.dict()
order_json = order.json()

FastAPI

FastAPI是一个基于Starlette和Pydantic的API框架,它具有非常高的性能,并且包含数据处理的功能。此外,它可以自动生成交互式API文档,便于开发和测试。