python 內(nèi)置庫(kù)wsgiref的使用(WSGI基礎(chǔ)入門)
wsgiref簡(jiǎn)單示例
運(yùn)行以下示例程序后,在瀏覽器中輸入以http://127.0.0.1:9999/開(kāi)頭的隨意一個(gè)url都可以看到返回結(jié)果。實(shí)例程序中所有url都會(huì)以同一個(gè)App進(jìn)行處理,實(shí)際生產(chǎn)環(huán)境中不同的url肯定是需要映射到不同的App上的,但這部分本文不作講解。
# wsgiref是Python自帶的內(nèi)置庫(kù),它用來(lái)開(kāi)發(fā)者對(duì)wsgi進(jìn)行測(cè)試用的,不可以用在生產(chǎn)環(huán)境中from wsgiref.simple_server import make_server, demo_app# wsgi也是基于socket server編寫# 默認(rèn)情況下會(huì)將所有url都傳入demo_app進(jìn)行處理,具體可參考demo_app源碼# app參數(shù)可以是任何可調(diào)用對(duì)象,但是內(nèi)部處理需要參考demo_app源碼,即environ處理、start_response調(diào)用、返回值類型ws = make_server(’127.0.0.1’, 9999, demo_app)# 啟動(dòng)服務(wù)ws.serve_forever()
demo_app源碼
def demo_app(environ,start_response): from io import StringIO stdout = StringIO() print('Hello world!', file=stdout) print(file=stdout) # environ是一個(gè)字典,包含了所有請(qǐng)求信息 h = sorted(environ.items()) for k,v in h:print(k,’=’,repr(v), file=stdout) # return之前需要調(diào)用start_response設(shè)置響應(yīng)頭信息 start_response('200 OK', [(’Content-Type’,’text/plain; charset=utf-8’)]) return [stdout.getvalue().encode('utf-8')] # 一個(gè)可迭代對(duì)象,元素為byte類型,元素內(nèi)容依據(jù)start_response中指定的Content-Type來(lái)指定
demo_app類定義的兩種方式
# 第一種方式:定義類的__init__和__iter__方法,前者用來(lái)接收和處理environ和start_response,后者生成一個(gè)可迭代對(duì)象# make_server中app參數(shù)只需傳入類名即可class ApplicationClass: def __init__(self, environ, start_response):self.e = environself.sr = start_response def __iter__(self):from io import StringIOstdout = StringIO()print('Hello world!', file=stdout)print(file=stdout)h = sorted(self.e.items())for k, v in h: print(k, ’=’, repr(v), file=stdout)self.sr('200 OK', [(’Content-Type’, ’text/plain; charset=utf-8’)])yield from [stdout.getvalue().encode('utf-8')]# 第二種方式:定義__call__方法,接收和處理environ和start_response,并返回一個(gè)可迭代對(duì)象# make_server中app參數(shù)需要傳入類的實(shí)例class ApplicationInstance: def __call__(self, environ, start_response):from io import StringIOstdout = StringIO()print('Hello world!', file=stdout)print(file=stdout)h = sorted(environ.items())for k, v in h: print(k, ’=’, repr(v), file=stdout)start_response('200 OK', [(’Content-Type’, ’text/plain; charset=utf-8’)])return [stdout.getvalue().encode('utf-8')]3. WSGI web服務(wù)器和應(yīng)用程序
WSGI web服務(wù)器
本質(zhì)上是一個(gè)TCP服務(wù)器,監(jiān)聽(tīng)在特定的端口上。 支持HTTP協(xié)議,能夠解析HTTP請(qǐng)求報(bào)文,能夠按HTTP協(xié)議將響應(yīng)數(shù)據(jù)封裝為報(bào)文并返回給瀏覽器。 實(shí)現(xiàn)了WSGI協(xié)議,該協(xié)議約定了和應(yīng)用程序之間的接口,即url到app之間的映射。WSGI應(yīng)用程序
遵從WSGI協(xié)議。 本身是一個(gè)可調(diào)用對(duì)象。 調(diào)用start_response,返回響應(yīng)頭部。 返回包含正文的可迭代對(duì)象。以上就是python 內(nèi)置庫(kù)wsgiref的使用(WSGI基礎(chǔ)入門)的詳細(xì)內(nèi)容,更多關(guān)于python wsgiref的使用的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. 父div高度不能自適應(yīng)子div高度的解決方案2. ASP.NET MVC解決上傳圖片臟數(shù)據(jù)的方法3. CSS3實(shí)例分享之多重背景的實(shí)現(xiàn)(Multiple backgrounds)4. JSP狀態(tài)管理的簡(jiǎn)單介紹5. jsp+mysql實(shí)現(xiàn)網(wǎng)頁(yè)的分頁(yè)查詢6. servlet+jsp實(shí)現(xiàn)過(guò)濾器 防止用戶未登錄訪問(wèn)7. 選擇模式 - XSL教程 - 28. Java之JSP教程九大內(nèi)置對(duì)象詳解(中篇)9. 淺談XML Schema中的elementFormDefault屬性10. ASP中SELECT下拉菜單同時(shí)獲取VALUE和TEXT值的實(shí)現(xiàn)代碼
