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