Python Web開發:從 wsgi 開始

本文參考了:python

想要理解wsgi,首先得區分一個概念:server 和 app。nginx

此圖來源於:www.toptal.com/python/pyth…django

uwsgi、gunicorn是 server,咱們寫的 django、flask、sanic 程序是 app。app 就是一個可被調用的對象(callable object),server 會解析請求數據傳給 app,app 運行業務邏輯以後,把結果返回給 server。flask

現實生活中,咱們部署的時候,可能還會在 server 前面加上一個 nginx,因此整個流程簡單來講是這樣的:bash

app 可嵌套 -> 中間件

app 是一個可調用對象,這意味着我能夠在 app1裏面調用 app2,app2裏面再調用 app3,這樣一層一層嵌套下去。這不就是 middleware 嗎?微信

若是你看過 django middleware 的源碼,會看到MiddlewareMixin這個類:cookie

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__方法,它是一個可調用對象。session

你在 django 配置文件中定義的:app

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 字典:

這裏麪包含了這次請求的全部必要信息,經過這個字典,app就能知道此次請求的 path 是/auth,因而就知道該調用哪一個 handler 函數。還能經過 HTTP_COOKIE知道 cookie 值,而後能夠定位到具體的用戶。

  • start_response(status, headers,errors)

Server 傳給 app 的回調函數,返回數據給 server 以前須要先調用這個回調函數,通知 server 你該來獲取返回數據了。

據說這個參數實已經快有被廢棄了,不須要徹底瞭解。下圖來源於:WSGI: The Server-Application Interface for Python底部評論區。

若是你像我同樣真正熱愛計算機科學,喜歡研究底層邏輯,歡迎關注個人微信公衆號:

相關文章
相關標籤/搜索