Python Web开发:从 wsgi 开始

栏目: Python · 发布时间: 5年前

内容简介:本文参考了:想要理解wsgi,首先得区分一个概念:server 和 app。此图来源于:

本文参考了:

想要理解wsgi,首先得区分一个概念:server 和 app。

此图来源于: www.toptal.com/python/pyth…

Python Web开发:从 wsgi 开始

uwsgi、gunicorn是 server,我们写的 django、flask、sanic 程序是 app。app 就是一个可被调用的对象(callable object),server 会解析请求数据传给 app,app 运行业务逻辑之后,把结果返回给 server。

现实生活中,我们部署的时候,可能还会在 server 前面加上一个 nginx,所以整个流程简单来说是这样的:

Python Web开发:从 wsgi 开始

app 可嵌套 -> 中间件

app 是一个可调用对象,这意味着我可以在 app1里面调用 app2,app2里面再调用 app3,这样一层一层嵌套下去。这不就是 middleware 吗?

Python Web开发:从 wsgi 开始

如果你看过 django middleware 的源码,会看到 MiddlewareMixin 这个类:

class MiddlewareMixin:
    def __init__(self, get_response=None):
        self.get_response = get_response
        super().__init__()

    def __call__(self, request):
        response = None
        if hasattr(self, 'process_request'):
            response = self.process_request(request)
        response = response or self.get_response(request)
        if hasattr(self, 'process_response'):
            response = self.process_response(request, response)
        return response
复制代码

定义了一个 __call__ 方法,它是一个可调用对象。

你在 django 配置文件中定义的:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
复制代码

运行的时候,就是这样一个一个地调用 middleware,直到调用到你的业务逻辑代码(最终的 app 部分)。

后面会再详细讲讲中间件开发。

app向server暴露的接口

app 是一个可调用的对象,它需要接收一些参数,具体如下:

def app(environ,start_response):
    pass
复制代码

具体看一下这两个参数:

  • environ,就是一个保护请求信息的字典。

比如 server 收到 GET http://localhost:8000/auth?user=obiwan&token=123 这条请求后,会生成下面这样一个 environ 字典:

Python Web开发:从 wsgi 开始

这里面包含了此次请求的所有必要信息,通过这个字典,app就能知道这次请求的 path 是 /auth ,于是就知道该调用哪个 handler 函数。还能通过 HTTP_COOKIE知道 cookie 值,然后可以定位到具体的用户。

  • start_response(status, headers,errors)

Server 传给 app 的回调函数,返回数据给 server 之前需要先调用这个回调函数,通知 server 你该来获取返回数据了。

听说这个参数实已经快有被废弃了,不需要完全了解。下图来源于: WSGI: The Server-Application Interface for Python 底部评论区。

Python Web开发:从 wsgi 开始
Python Web开发:从 wsgi 开始

如果你像我一样真正热爱计算机科学,喜欢研究底层逻辑,欢迎关注我的微信公众号:

Python Web开发:从 wsgi 开始

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Cypherpunks

Cypherpunks

Julian Assange、Jacob Appelbaum、Andy Müller-Maguhn、Jérémie Zimmermann / OR Books / 2012-11 / GBP 8.99

Cypherpunks are activists who advocate the widespread use of strong cryptography (writing in code) as a route to progressive change. Julian Assange, the editor-in-chief of and visionary behind WikiLea......一起来看看 《Cypherpunks》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具