Python Web开发:从 wsgi 开始

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

内容简介:本文参考了:想要理解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 开始

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

查看所有标签

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

程序员之禅

程序员之禅

[德] Christian Grobmeier / 荣耀、朱艳 / 人民邮电出版社 / 2015-8 / 39.00元

禅是一种生活态度和生活方式。程序员是一份特别辛苦的职业,也是一个承受各种压力的群体。在物欲横流的今天,禅对于程序员有着特殊的意义和价值。 本书的作者是一名德国程序员老兵,深谙程序员的喜怒哀乐。他曾经发表了一篇题为“程序员之禅的十条法则”的博客文章,引发众多程序员热烈的讨论和强烈的共鸣。本书共10章,结合程序员日常生活和工作的方方面面,作者通过对禅的知识、理解、体验、思考和感悟,提出很多中肯的......一起来看看 《程序员之禅》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具