美文网首页Starlette 解读 by Gascognya
Starlette 源码阅读 (十五) 转换器&中间件&状态码

Starlette 源码阅读 (十五) 转换器&中间件&状态码

作者: Gascognya | 来源:发表于2020-08-20 10:07 被阅读0次

本章是最后一章,将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的一种查询语言,理念非常先进。但因为种种原因,难以推行。

具体原因可看:
https://www.zhihu.com/question/38596306

testclient.py

测试客户端允许您使用该requests库针对ASGI应用程序发出请求。
测试可以使用swagger等API文档进行。

schemas.py

对API模式的简单支持,这点在FastAPI中间具有了非常优秀的实现,所以将这方面内容放到FastAPI的解读中

剩余文件: 0

作为阅历尚且的新人,这是我第一次尝试阅读源码。过程中有不少苦难,也带给了我很多真真切切的惊喜。文章有很多不专业的地方,还请多多包涵。

更新:
在这篇文章发布时,uvicorn和h11库的阅读工作已经进行至半程,和starlette有关的流程,基本探明。
但是,其过程比我预想的还要困难无数倍。
首先,uvicorn的工作原理和我预想的是由偏差的。
其次,库与库直接错综复杂,并不是像starlette这样功能分明。
个人决定暂时不将整个阅读流程发不出来。近两天更新两篇关于其原理的简介。这样更方便理解。不然会淹没在巨量隐晦难懂的源码中,让人看得云里雾里的

相关文章

网友评论

    本文标题:Starlette 源码阅读 (十五) 转换器&中间件&状态码

    本文链接:https://www.haomeiwen.com/subject/hcmhjktx.html