一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

django進階:從WSGI的介紹到Django原理解析

 風聲之家 2021-04-20
WSGI(Web 服務(wù)器網(wǎng)關(guān)接口)是python中所定義的Web Server和Web APP之間或框架之間的接口標準規(guī)范。當使用 Python 進行 web 開發(fā)時,要深刻理解 Django、Flask、Tornado等 web 框架,WSGI是你繞不過去的檻兒。
WSGI接口規(guī)范的目的就是規(guī)范Web服務(wù)器與Web應(yīng)用之間的交互,在協(xié)議之間進行轉(zhuǎn)換。
WSGI將Web組件分成三類:
  • Web服務(wù)器(Server): 監(jiān)聽某個端口的http服務(wù)器
  • Web應(yīng)用程序(APP): 指的是可以被調(diào)用的一個對象,一般指的是一個函數(shù) 或者 包含一個__call__方法的類的實例
  • Web中間件(Middleware):處于服務(wù)器和應(yīng)用中間,起到承接的作用,用Python的術(shù)語來說,中間件就類似于一個裝飾器
例如:



#這是一個appdef app(environ, start_response):      return []
那么中間件通常是這樣定義:



def  middleware(environ, start_response):      #這里編寫中間件的代碼     return app(environ, start_response)
django 整個項目實際上也是這三部分組成,我們在執(zhí)行python manage.py runserver 的時候,
  1. 就首先啟動了一個8000端口的http服務(wù)器(這個就是Web服務(wù)器)
  2. 然后 django里面的中間件(這個就是上述所說的Web中間件),這個是定義在 settings.py 文件的 MIDDLEWARE
  3. 最后 django加載里面的app(這個就是上述所說的Web應(yīng)用程序),這個是定義在 settings.py 文件的 INSTALLED_APPS

WSGI App介紹

WSGI APP是一個可調(diào)用的對象(callable object),常用的可調(diào)用的對象有三種:
1.一個函數(shù)或者類的方法:


def app(environ, start_response):   這是一個app      return []
2.一個實現(xiàn)__call__()方法的類的實例:







class app:
def __call__(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return []
這個可調(diào)用的對象有幾點需要說明一下:
  1. 接收兩個參數(shù)environstart_response
    • environ 是一個字典,里面儲存了HTTP request的所有內(nèi)容。在django里面,通常會把environ 封裝成為一個request。
    • start_response 是一個WSGI Server(http 服務(wù)器)傳遞過來的函數(shù),用于將response header, status傳遞給Server。
    • start_response(status, headers), 它的作用是返回狀態(tài)碼 以及 頭部信息, status必須是一個字符串,格式是 “狀態(tài)碼 + 說明”。
    • headers 是一個數(shù)組,按照 [(key, value), (key, value) ] 這樣的格式來組織。
  2. 它需要返回一個可迭代的值,用于將response body傳遞給Server。["hello world", "baby"]

WSGI Server介紹

WSGI Server可以理解為就是一個實現(xiàn)了wsgi協(xié)議的http服務(wù)器,使用wsgi協(xié)議的方式來調(diào)用WSGI APP。
通常來說,它由兩部分組成:
1.http 服務(wù)器:這里具體的代碼就不寫了,大概就是


socket = eventlet.listen(('localhost', '8000'), backlog = 10)  定義一個wsgi http服務(wù)器server = eventlet.spawn(event.wsgi.server, socket, app) 把service 和 app進行綁定
2.調(diào)用app的主方法:










def run(application): #服務(wù)器程序調(diào)用應(yīng)用程序      environ = {}#設(shè)定參數(shù)      def start_response(status, headers): #設(shè)定狀態(tài)和頭部參數(shù)的回調(diào)函數(shù)            pass
result = application(environ, start_response)#調(diào)用APP的__call__函數(shù)(這里APP是一個類) def write(data): # 這是把響應(yīng)發(fā)到前端的函數(shù) pass def data in result: # 迭代訪問,把響應(yīng)發(fā)到前端 write(data)
服務(wù)器程序主要做了以下的事:
  • 設(shè)定app所需要的參數(shù)(environ,start_response)
  • 調(diào)用app
  • 迭代訪問app的返回結(jié)果(response body),并傳給客戶端
但實際上已經(jīng)有很多已經(jīng)封裝好的WSGI Server供我們使用,只需簡單的將APP與一些其他的參數(shù)綁定來創(chuàng)建一個Server,而這個Server會將它接收到的request傳遞給綁定的APP。
下面是django自帶的服務(wù)器:











from wsgiref.simple_server import make_server
# 定義我們一個最簡單的appdef application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return [b'<h1>Hello, web!</h1>']
# 創(chuàng)建一個服務(wù)器,IP地址為空,端口是8000,處理函數(shù)是application:httpd = make_server('', 8000, application)print('Serving HTTP on port 8000...') # 開始監(jiān)聽HTTP請求:httpd.serve_forever()
這里我們已經(jīng)自己編寫了一個最基礎(chǔ)的web框架,是不是很激動,django的本質(zhì)就是這樣的一種形式,是不是感覺發(fā)現(xiàn)了新大陸。

WSGI Middleware介紹

middleware的概念沒有appllicationserver那么容易理解。假設(shè)一個符合application標準的可調(diào)用對象,它接受可調(diào)用對象作為參數(shù),返回一個可調(diào)用對象的對象。那么對于server來說,它是一個符合標準的可調(diào)用對象,因此是application。而對于application來說,它可以調(diào)用application,因此是server。這樣的可調(diào)用對象稱為middleware
middleware的概念非常接近decorator。
中間件對于app來說,它是一個service. 但是對于service來說,它確實一個app。文字說的不清晰,還是用代碼來說比較好。



































# 這是一個標準的application objectdef index(environ, start_response):    start_response('200 OK', [('Content-Type', 'text/html')])    return ['index page']
# 這是一個標準的application objectdef hello(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return ['hello page']
# 這是一個標準的application objectdef not_found(environ, start_response): start_response('404 NOT FOUND', [('Content-Type', 'text/plain')]) return ['Not Found Page']
###上面我們定義了三個app### 然后我們定義一個中間件 middleware,這個中間件的形式是跟app是一樣的def application(environ, start_response): path = environ.get('PATH_INFO', '').lstrip('/') #這句代碼是獲取url
urls = [ # 這里定義路由 ('index', index), ('hello', hello) ]
for item in urls: # 這里根據(jù)路由,執(zhí)行不同的app if item[0] == path: app = item[1] return app(environ, start_response) else: return not_found(environ, start_response) # 如果找不到,則執(zhí)行默認的appfrom wsgiref.simple_server import make_server
# 創(chuàng)建一個服務(wù)器,IP地址為空,端口是8000,處理函數(shù)是application:httpd = make_server('', 8000, application)httpd.serve_forever()
看到?jīng)]有,這個例子比上面的更加完善,利用中間件實現(xiàn)了路由的功能,把django最基礎(chǔ)的功能完整的展示出來
中間件除了路由之外,還可以做很多事情,最常見的還有:
  • 負載均衡,轉(zhuǎn)發(fā)用戶請求 
  • 預(yù)處理 XSL 等相關(guān)數(shù)據(jù)
  • 限制請求速率,設(shè)置白名單

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    亚洲高清中文字幕一区二区三区 | 国产一区二区三区色噜噜| av国产熟妇露脸在线观看| 日本免费熟女一区二区三区| 国产老熟女超碰一区二区三区| 日本加勒比在线观看一区| 欧美激情一区二区亚洲专区| 欧美精品女同一区二区| 日本精品视频一二三区| 亚洲国产av精品一区二区| 亚洲一区二区三区三区| 风间中文字幕亚洲一区| 欧美老太太性生活大片| 日韩综合国产欧美一区| 欧美国产日韩在线综合| 日韩一区欧美二区国产| 欧美一级片日韩一级片| 精品国模一区二区三区欧美| 亚洲综合精品天堂夜夜| 国产又粗又硬又大又爽的视频| 亚洲欧美日韩另类第一页| 午夜精品黄片在线播放| 色婷婷人妻av毛片一区二区三区| 暴力三级a特黄在线观看| 少妇毛片一区二区三区| 国产成人av在线免播放观看av | 尹人大香蕉一级片免费看| 国产免费一区二区三区不卡| 绝望的校花花间淫事2| 男女激情视频在线免费观看| 激情内射日本一区二区三区| 精品少妇人妻av免费看| 精品熟女少妇av免费久久野外| 久久99精品日韩人妻| 99国产高清不卡视频| 亚洲永久一区二区三区在线| 中文字幕日韩无套内射| 亚洲一区精品二人人爽久久| 大香蕉伊人精品在线观看| 高中女厕偷拍一区二区三区| 国产精品日本女优在线观看|