美文网首页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