本章是最后一章,将starlette最后内容进行简介
convertors.py
查询参数的类型转换器,包括以下5种转换器,在解读requests的章节有提到过
{
"str": StringConvertor(),
"path": PathConvertor(),
"int": IntegerConvertor(),
"float": FloatConvertor(),
"uuid": UUIDConvertor(),
}
中间件
官方提供的中间件包括
exceptions.py
中的最内层中间件,官方一共提供了9种中间件
ServerErrorMiddleware
: 堆栈最外层的中间件,用于捕获服务器的500,被starlette的app
连接
AuthenticationMiddleware
: 用于身份验证的中间件
BaseHTTPMiddleware
: 一个抽象类,使您可以针对请求/响应接口编写ASGI中间件,而不是直接处理ASGI消息。
CORSMiddleware
: CORS,这个都很熟悉了,不做过多介绍
GZipMiddleware
: GZIP用于包括任何请求响应"gzip"中的Accept-Encoding报头
HTTPSRedirectMiddleware
: 强制所有传入请求必须为https或wss。取而代之的是将任何传入请求http或ws重定向到安全方案的请求。
SessionMiddleware
: 添加基于签名的基于cookie的HTTP会话。会话信息可读但不可修改。
WSGIMiddleware
: 用于处理WSGI相关的中间件
ExceptionMiddleware
: 最内层中间件,用于捕获异常
具体使用方法可以查看官方的文档 :
https://www.starlette.io/middleware/#sessionmiddleware
中间件加入方法示例,原理可以参考第一章关于中间件堆栈
middleware = [
Middleware(HTTPSRedirectMiddleware),
Middleware(CORSMiddleware, allow_origins=['*']),
# Middleware类位于middleware的__init__.py中
]
app = Starlette(routes=routes, middleware=middleware)
status.py
关于http和websocket的状态码语义化重命名,方便理解
其大概格式如下,可自行查看,或者直接百度
HTTP_100_CONTINUE = 100
HTTP_101_SWITCHING_PROTOCOLS = 101
HTTP_200_OK = 200
HTTP_201_CREATED = 201
HTTP_202_ACCEPTED = 202
HTTP_203_NON_AUTHORITATIVE_INFORMATION = 203
HTTP_204_NO_CONTENT = 204
. . . . . .
types.py
一些常用类型的简化
Scope = typing.MutableMapping[str, typing.Any]
Message = typing.MutableMapping[str, typing.Any]
Receive = typing.Callable[[], typing.Awaitable[Message]]
Send = typing.Callable[[Message], typing.Awaitable[None]]
ASGIApp = typing.Callable[[Scope, Receive, Send], typing.Awaitable[None]]
graphql.py
GraphQL,Facebook的一种查询语言,理念非常先进。但因为种种原因,难以推行。
testclient.py
测试客户端允许您使用该requests库针对ASGI应用程序发出请求。
测试可以使用swagger等API文档进行。
schemas.py
对API模式的简单支持,这点在FastAPI中间具有了非常优秀的实现,所以将这方面内容放到FastAPI的解读中
剩余文件: 0
作为阅历尚且的新人,这是我第一次尝试阅读源码。过程中有不少苦难,也带给了我很多真真切切的惊喜。文章有很多不专业的地方,还请多多包涵。
更新:
在这篇文章发布时,uvicorn和h11库的阅读工作已经进行至半程,和starlette有关的流程,基本探明。
但是,其过程比我预想的还要困难无数倍。
首先,uvicorn的工作原理和我预想的是由偏差的。
其次,库与库直接错综复杂,并不是像starlette这样功能分明。
个人决定暂时不将整个阅读流程发不出来。近两天更新两篇关于其原理的简介。这样更方便理解。不然会淹没在巨量隐晦难懂的源码中,让人看得云里雾里的
网友评论