摘要:一般來說,這一例行程序用于處理請(qǐng)求的每一部分,例如把路徑作為一系列字典鍵值進(jìn)行處理。,必須是按照中所規(guī)定地鍵值元組列表。行為時(shí)回車換行。這個(gè)包裝器也可能用模塊指明那些有問題的,但不完全違反的行為。
wsgirf-WSGI功能及參考實(shí)現(xiàn)
源碼:Lib/wsgiref
Web服務(wù)器網(wǎng)關(guān)接口(Web Server Gateway Interface, WSGI),是用Python寫的一個(gè)服務(wù)器軟件和web應(yīng)用之間的通用接口。使用通用接口,能夠使同一個(gè)應(yīng)用方便的被不同過的web服務(wù)器調(diào)用。
只有web服務(wù)器和軟件框架作者需要知道WSGI設(shè)計(jì)的細(xì)節(jié)和極端情況。你只需要安裝一個(gè)WSGI應(yīng)用或者用現(xiàn)有框架寫一個(gè)web應(yīng)用,并不需要知道WSGI的全部細(xì)節(jié)。
wsgiref是WSGI細(xì)則的一個(gè)參考實(shí)現(xiàn),用于給web服務(wù)器和框架提供WSGI支持。它提供了處理WSGI環(huán)境變量、response頭和WSGI服務(wù)器基類的功能,一個(gè)服務(wù)于WSGI應(yīng)用的HTTP服務(wù)器demo,以及檢測WSGI服務(wù)器和應(yīng)用是否和WSGI細(xì)則(PEP 3333)是否一致的驗(yàn)證工具。
去wsgi官網(wǎng)獲取更多信息和相關(guān)教程。
wsgiref.util - WSGI環(huán)境工具本模塊提供了一些列用于WSGI環(huán)境的適用功能。 根據(jù)PEP 3333, WSGI環(huán)境是一個(gè)包含HTTP請(qǐng)求變量的字典。所有接受environ參數(shù)的函數(shù)都預(yù)期接受一個(gè)兼容于WSGI的字典。詳見PEP 3333。
wsgiref.util.guess_scheme(environ)通過檢查環(huán)境變量中的HTTPS,返回wsgi.url_scheme是http還是https。
這個(gè)函數(shù)用于,創(chuàng)建一個(gè)包裝CGI或者FastCGI協(xié)議的網(wǎng)關(guān)。一般來說,提供這些協(xié)議的服務(wù)器,當(dāng)使用SSL時(shí),會(huì)提供一個(gè)值為"1", "yes"或者"on"的HTTPS變量。如果找到了,這個(gè)函數(shù)返回"https";否則,返回"http"。
返回請(qǐng)求的URI,可選參數(shù)決定是否返回查詢字符串,使用PEP 3333中的"URL Reconstruction"算法。
wsgiref.util.application_uri(environ)與request_uri方法類似,除了忽略PATH_INFO 還有QUERY_STRING變量。返回結(jié)果為發(fā)起請(qǐng)求的應(yīng)用對(duì)象的基地址(base uri)。
wsgiref.util.shift_pathi_info(environ)將環(huán)境變量中PAHT_INFO移動(dòng)一個(gè)名字到SCRIPT_NAME,并返回。環(huán)境變量會(huì)被原地修改,如果你要保存原始值,存一個(gè)備份 。
如果PAHT_INFO中沒有剩余的路徑節(jié)段,返回None。
一般來說,這一例行程序用于處理請(qǐng)求URI的每一部分,例如把路徑作為一系列字典鍵值進(jìn)行處理。這一例行程序,修改傳入的環(huán)境變量,使其用于激活目標(biāo)URI的WSGI應(yīng)用。比如,在路徑/foo上有一個(gè)WSGI應(yīng)用,請(qǐng)求URI為/foo/bar/baz,/foo處的WSGI應(yīng)用調(diào)用shift_path_info(),將會(huì)得到"bar",環(huán)境變量會(huì)被更新,使其傳向/foo/bar/處的WSGI應(yīng)用。也就是說SCRIPT_NAME從/foo變?yōu)?b>/foo/bar,PATH_INFO從/bar/baz變?yōu)?b>/baz。
當(dāng)路徑僅為"/"時(shí),該例行程序返回空字符串,并在SCRIPT_NAME處添加末尾斜杠。盡管空路徑片段一般都被忽略了。但SCRIPT_NAME一般不以斜杠結(jié)束。故意這樣設(shè)計(jì),是為了讓應(yīng)用在做對(duì)象遍歷時(shí),能夠區(qū)分/x和/x/這兩個(gè)不同的路徑。
# 源碼 # https://github.com/python/cpython/blob/master/Lib/wsgiref/util.py#L102 if not name and not script_name.endswith("/"): script_name += "/"wsgiref.util.setup_testing_defaults(environ)
為了測試而更新環(huán)境變量。
這個(gè)例行程序?yàn)閃SGI添加各種參數(shù),包括HTTP_HOST, SERVER_NAME, SERVER_PORT, REQUESTS_METHOD, SCRIPT_NAME。以及PEP 3333中頂以的所有wsgi.*變量。只提供默認(rèn)值,不替代現(xiàn)有值。
這個(gè)理性城市,是為了建立一個(gè)環(huán)境,讓W(xué)SGI和應(yīng)用的單元測試變得更簡單。不應(yīng)該應(yīng)用在真實(shí)的WSGI服務(wù)器上,因?yàn)閿?shù)據(jù)都是假的。
from wsgiref.util import setup_testing_defaults from wsgiref.simple_server import make_server # A relatively simple WSGI application. It"s going to print out the # environment dictionary after being updated by setup_testing_defaults def simple_app(environ, start_response): # 創(chuàng)建虛假環(huán)境 setup_testing_defaults(environ) status = "200 OK" headers = [("Content-type", "text/plain; charset=utf-8")] # 發(fā)送頭部 start_response(status, headers) ret = [("%s: %s " % (key, value)).encode("utf-8") for key, value in environ.items()] return ret # 這行代碼我在3.6.1下運(yùn)行會(huì)出錯(cuò),make_server不支持上下文管理? # 把with 語句改成普通的語句好像就沒問題了。 with make_server("", 8000, simple_app) as httpd: print("Serving on port 8000...") httpd.serve_forever()
除了上述函數(shù),wsgiref.util還提供了其他各種功能。
wsgiref.util.is_hop_by_hop(header_name)
根據(jù)[RFC 2616](https://tools.ietf.org/html/rfc2616.html),如果`header_name`是`"Hop-by-Hop"`返回True.
wsgiref.util.FileWrapper(filelike, blksize=8192)
一個(gè)把類文件對(duì)象轉(zhuǎn)變?yōu)槌傻鞯陌b器。結(jié)果支持`__getitem__()`和`__iter__()`。當(dāng)?shù)闅v這個(gè)對(duì)象時(shí),`blksize`參數(shù)會(huì)被重復(fù)地傳給類文件對(duì)象地`read()`方法,獲取產(chǎn)生的字節(jié)。當(dāng)`read()`產(chǎn)生空字節(jié)時(shí),迭代結(jié)束。 如果這個(gè)類文件對(duì)象有`close()`方法,返回的對(duì)象也有`close()`方法,當(dāng)被調(diào)用時(shí),會(huì)激活類文件對(duì)象的`close()`方法。
from io import StringIO from wsgiref.util import FileWrapper # We"re using a StringIO-buffer for as the file-like object filelike = StringIO("This is an example file-like object"*10) wrapper = FileWrapper(filelike, blksize=5) for chunk in wrapper: print(chunk)wsgi.headers WSGI response 頭工具
本模塊只提供一個(gè)類:Headers。使用(mapping-like interface)映射接口, 方便操作地操作WSGI地響應(yīng)頭。
wsgiref.headers.Headers([headers])類創(chuàng)建一個(gè)映射對(duì)象包裝headers。 headers,必須是按照PEP 3333中所規(guī)定地鍵值元組列表。默認(rèn)值時(shí)一個(gè)空列表。】
Headers對(duì)象支持映射操作,包括__getitem(), get(), __setitem(), setdefault(), __delitem(), 以及__contain__()。key是name,值是該name下的第一個(gè)值。
與字典不同,在你試圖刪除或者get一個(gè)不存在key時(shí),Headers對(duì)象不會(huì)拋出異常。Headers的長度等于它items()的長度,
bytes()函數(shù),返回一個(gè)格式化的字符串,用于傳輸HTTP響應(yīng)頭。每個(gè)頭占一行,用冒號(hào)和控開關(guān)白分割。行為時(shí)回車+換行。結(jié)尾是一個(gè)空行
get_all(name)
返回對(duì)應(yīng)name下所有的值
返回順序?yàn)樗麄冊谧畛醯念^中的位置,或者他們被添加進(jìn)實(shí)例的順序??赡軙?huì)重復(fù)。
add_header(name, value, **_params)
添加一個(gè)頭,通過關(guān)鍵詞參數(shù)可以添加MIME參數(shù)。
在參數(shù)名里的下劃線會(huì)被轉(zhuǎn)換成連接符。因?yàn)檫B接符在python標(biāo)識(shí)符中不合法,但在MIME參數(shù)中有很多連接符。
wsgiref.simple_server一個(gè)簡單的WSGI HTTP服務(wù)器本模塊提供了一個(gè)簡單的基于http.server的,可服務(wù)于WSGI應(yīng)用的HTTP服務(wù)器。每一個(gè)服務(wù)器實(shí)例,在一個(gè)給定的主機(jī)和端口上服務(wù)于一個(gè)WSGI應(yīng)用。如果你想在一個(gè)主機(jī)和端口上,服務(wù)于多個(gè)應(yīng)用,你應(yīng)當(dāng)創(chuàng)建一個(gè)WSGI應(yīng)用,解析PATH_INFO決定對(duì)于每個(gè)請(qǐng)求,應(yīng)該選擇哪個(gè)應(yīng)用。
wsgiref.simple_server.make_server(host, port, app, server_class=WSGIServer, handle_class=WSGIRequestHandler)在指定host和port上,創(chuàng)建一個(gè)新的WSGI服務(wù)器,接受來自app的連接。返回值是傳入的server_class的一個(gè)實(shí)例。并會(huì)使用handler_class處理requests。app參數(shù)必須是一個(gè)符合PEP 3333定義的WSGI應(yīng)用對(duì)象。
wsgirfe.simple_server.demo_app(environ, start_response)本函數(shù)是一個(gè)小而完全的WSGI程序,返回一個(gè)包含"Hello world!"和環(huán)境變量k-v值對(duì)的文本頁。用于確認(rèn)WSGI服務(wù)器能夠爭取的處理WSGI程序。
wsgiref.simple_server.WSGIServer(server_address, RequestsHandlerClass)類創(chuàng)建一個(gè)WSGISever實(shí)例,server_address應(yīng)當(dāng)是(host, port)元組,RequestHandlerClass應(yīng)當(dāng)是http.server.BasedHTTPRequestHandler的子類,用于處理requests。
你不需要正式調(diào)用構(gòu)造器,因?yàn)?b>make_server()函數(shù)會(huì)幫你處理細(xì)節(jié)。
WSGIServer是http.server.HTTPServer的子類,所以繼承了其方法,如:serve_forever()和handle_request()。WSGIServer同時(shí)也提供了一些WSGI專有的方法。比如:
set_app(application)
設(shè)置一個(gè)可調(diào)用應(yīng)用,作為接收requests的WSGI應(yīng)用。
get_app()
返回目前設(shè)置的可調(diào)用應(yīng)用。
一般來說,你不要調(diào)用這些額外的方法。 set_app()一般有make_server()調(diào)用,get_app()主要是為了requests handler實(shí)例而存在。
wsgiref.simple_server.WSGIRequestHandler(reqeust, client_address, server)類對(duì)于給定的request(例如,一個(gè)socket), client_address (一個(gè)(host, port)元組)server,創(chuàng)建一個(gè)HTTP handler。
你不需要直接創(chuàng)建這個(gè)類的實(shí)例,他們會(huì)由WSGIServer對(duì)象按需創(chuàng)建。單你可以創(chuàng)建一個(gè)該類的子類,作為handler_class參數(shù),傳給make_server()函數(shù)。以下為一些在子類中可能相關(guān)的需要重寫的函數(shù)。
get_environ()
返回一個(gè)包含WSGI環(huán)境的字典。默認(rèn)設(shè)置返回WSGIServer對(duì)象的base_environ字典屬性,并加上來自HTTP request的各種頭部。每次調(diào)用這個(gè)方法,都會(huì)放回一個(gè)新的字典,包含各種PEP 3333中規(guī)定的CGI環(huán)境變量。
get_stderr()
返回被用作wsgi.errors流的對(duì)象。默認(rèn)設(shè)置返回sys.stderr。
handle()
處理HTTP請(qǐng)求,默認(rèn)這是使用wsgiref.hanlder類創(chuàng)建一個(gè)handler實(shí)例,執(zhí)行真實(shí)的WSGI應(yīng)用接口。
wsgirref.validate WSGI一致性檢查器當(dāng)創(chuàng)建新的WSGI應(yīng)用對(duì)象、框架、服務(wù)器和中間件時(shí),用wsgiref.validate檢查新代碼是否可用是非常有用過的。本模塊提供了一個(gè)能創(chuàng)建WSGI應(yīng)用對(duì)象的函數(shù),使WSGI服務(wù)器和WSGI應(yīng)用對(duì)象能夠正常通信,檢查兩側(cè)協(xié)議的一致性。
注意這個(gè)應(yīng)用不保證完全符合PEP 3333。這個(gè)模塊不報(bào)錯(cuò),不意味著肯定沒錯(cuò)。但是,如果這個(gè)模塊報(bào)錯(cuò),就意味著肯定有錯(cuò)誤。不是100%兼容。
這個(gè)模塊基于Python Paste。
wsgiref.validate.validator(application)`包裝application并返回一個(gè)新的WSGI應(yīng)用對(duì)象,返回的應(yīng)用將會(huì)把所有的請(qǐng)求發(fā)送給最初的應(yīng)用。并且檢查這個(gè)應(yīng)用和啟動(dòng)它的服務(wù)器是否遵循WSGI規(guī)則和RFC 2616
任何檢測到的不一致的結(jié)果,都會(huì)拋出一個(gè)AssertionError。但,如何處理這些異常取決于服務(wù)器。比如,wsgiref.simple_server和提前基于wsgiref.handlers的服務(wù)器,會(huì)直接輸出錯(cuò)誤信息,將回溯信息輸出到sys.stderr或者其他錯(cuò)誤流中。
這個(gè)包裝器也可能用warning模塊指明那些有問題的,但不完全違反PEP 3333的行為。除非用Python命令行選項(xiàng)或者是warning的api禁止,這些細(xì)心會(huì)被輸出至sys.stderr。
wsgirf.handlers 服務(wù)器/網(wǎng)管基類這個(gè)模塊提供了配置WSGI服務(wù)器和網(wǎng)關(guān)的基類。這些基類處理了大部分與一個(gè)WSGI應(yīng)用之間的通信,只要給與了他們一個(gè)CGI樣的環(huán)境,以及輸入/輸出及錯(cuò)誤流。
wsgiref.hanlder.CGIHandler類通過sys.stdin, sys.stdout, sys.stderr和os.environ喚起CGI。當(dāng)你想要通過一個(gè)CGI腳本運(yùn)行一個(gè)WSGI程序時(shí)很有用。你可以使用CGIHandler().run(app)。
這個(gè)類是BaseCGIHandler的子類,并將wsgi.run()=True, wsgi.multithread=False, wsgi.multiprocess=True,并使用sys和os獲取必要的CGI流和環(huán)境。(參見CGI部分和前驅(qū)知識(shí))
wsgiref.handler.IISCGIHandler類在微軟的IIS服務(wù)器上激活CGIHandler。
wsgiref.handlers.BaseCGIHandler()類和CGIHandler類 類似。
wsgiref.handlers.BaseHandler一個(gè)抽象類。每個(gè)實(shí)例處理一個(gè)HTTP請(qǐng)求。盡管原則上你可以創(chuàng)建一個(gè)子類,從而能被多個(gè)請(qǐng)求服用。
只有一個(gè)方法能被外部調(diào)用。
run(app)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41143.html
摘要:腳本異常管理源代碼模塊為腳本提供了一個(gè)特殊的異常管理器。該模塊激活后,如果發(fā)生了未捕獲的異常,將會(huì)展示格式化的輸出報(bào)告。該報(bào)告包括源代碼每一層的回溯,以及當(dāng)前執(zhí)行程序的參數(shù)和局部變量。應(yīng)當(dāng)是含有異常類型異常值和對(duì)象的三元組,如同返回的那樣。 cgitb CGI腳本異常管理 源代碼: Lib/cgitb.py cgitb模塊為Python腳本提供了一個(gè)特殊的異常管理器。名字有點(diǎn)誤導(dǎo)人,它...
摘要:腳本異常管理源代碼模塊為腳本提供了一個(gè)特殊的異常管理器。該模塊激活后,如果發(fā)生了未捕獲的異常,將會(huì)展示格式化的輸出報(bào)告。該報(bào)告包括源代碼每一層的回溯,以及當(dāng)前執(zhí)行程序的參數(shù)和局部變量。應(yīng)當(dāng)是含有異常類型異常值和對(duì)象的三元組,如同返回的那樣。 cgitb CGI腳本異常管理 源代碼: Lib/cgitb.py cgitb模塊為Python腳本提供了一個(gè)特殊的異常管理器。名字有點(diǎn)誤導(dǎo)人,它...
摘要:最近添加的功能是通過表單上傳文件。腳本的輸出由兩部分組成,由一個(gè)空行分割。后者接受重復(fù)鍵值二進(jìn)制文件等。方法會(huì)返回所有為的值。進(jìn)行類型檢查是必須的,因?yàn)闀?huì)有好事的用戶,輸入重復(fù)的鍵名。 cgi 通用網(wǎng)關(guān)接口 前驅(qū)知識(shí) 網(wǎng)關(guān)協(xié)議學(xué)習(xí):CGI、FastCGI、WSGI 簡單點(diǎn)說: web服務(wù)器接受請(qǐng)求,啟動(dòng)CGI;CGI接受請(qǐng)求,處理,返回給服務(wù)器;服務(wù)器返回給用戶 cgi效率不高,每...
摘要:最近添加的功能是通過表單上傳文件。腳本的輸出由兩部分組成,由一個(gè)空行分割。后者接受重復(fù)鍵值二進(jìn)制文件等。方法會(huì)返回所有為的值。進(jìn)行類型檢查是必須的,因?yàn)闀?huì)有好事的用戶,輸入重復(fù)的鍵名。 cgi 通用網(wǎng)關(guān)接口 前驅(qū)知識(shí) 網(wǎng)關(guān)協(xié)議學(xué)習(xí):CGI、FastCGI、WSGI 簡單點(diǎn)說: web服務(wù)器接受請(qǐng)求,啟動(dòng)CGI;CGI接受請(qǐng)求,處理,返回給服務(wù)器;服務(wù)器返回給用戶 cgi效率不高,每...
閱讀 2078·2021-10-12 10:12
閱讀 795·2021-09-24 09:47
閱讀 1195·2021-08-19 11:12
閱讀 3483·2019-08-29 13:06
閱讀 691·2019-08-26 11:43
閱讀 2579·2019-08-23 17:20
閱讀 1156·2019-08-23 16:52
閱讀 2607·2019-08-23 14:27