1. WSGI
WSGI即Web服務網關接口,這是一種協議。uwsgi 和 wsgiref 都是基於這個協議。Django 沒有自己的 socket,默認使用的是 wsgiref
。wsgiref 由於性能原因,一般用於本地測試環境,uwsgi支持併發的一些設置可用於生產環境。
2. Django請求的生命週期
socket的作用是接收請求和響應請求。當用戶向socket發送請求數據後,socket還需要對請求數據進行解析,根據請求數據來響應不同的內容。Django做的就是解析請求數據(需要從socket中獲取請求相關信息),找到對應的響應內容(產出字符串),然後返回給socket,socket再發送響應數據給用戶。Django不關心socket接發數據,只關心 從socket那裏獲取到請求數據並處理和返回請求數據給socket
。
def RunServer(environ, start_response):
"""
:param environ: 請求相關的所有操作
:param start_response:socket給Django的容器,Django最後要把容器給socket,可以用來方請求頭
:return:
"""
# Django框架開始
# 中間件
# 路由系統
# 視圖函數
# 數據庫
# 模板引擎的渲染
# 最後把響應頭+響應體通過socket返回給用戶
start_response('200 OK', [('Content-Type', 'text/html')])
return [bytes('<h1>!!!</h1>', encoding='utf-8')]
if __name__ == '__main__':
"""
下面兩句代碼的操作是:創建socket服務端和等待客戶端連接
"""
httpd = make_server('localhost', 8000, RunServer)
httpd.serve_forever()
Django部分源碼,Django請求處理的入口點:
Django請求的生命週期流程:用戶->WSGI->中間件->視圖函數(數據庫和模板進行渲染)->中間件->WSGI->用戶,中間件和視圖函數部分屬於Django。