摘要:在實(shí)際創(chuàng)建一個(gè)運(yùn)行的時(shí),一個(gè)參數(shù)都不需要我們傳,無(wú)論是還是回調(diào)函數(shù)都由服務(wù)器,也就是負(fù)責(zé)。如上所述,兩個(gè)參數(shù),回調(diào)函數(shù)傳入和最后返回一個(gè)字符串,也就是服務(wù)器返回給客戶端的核心數(shù)據(jù)。
Python中的WSGI
https://jasonlvhit.github.io/...
簡(jiǎn)單來(lái)看,wsgi是web組件的接口規(guī)范,在wsgi規(guī)范里,wsgi把web組件分成三個(gè)部分,wsgi server,wsgi middleware,wsgi application
application更多的時(shí)候,我們關(guān)心的只是wsgi application, wsgi application就是一個(gè)Python中的callable對(duì)象(函數(shù),或定義了__call__方法的類等), 接受兩個(gè)參數(shù),environ和start_response,參數(shù)只是一個(gè)名字而已,environ指的是環(huán)境變量,start_response是一個(gè)回調(diào)函數(shù)。在實(shí)際創(chuàng)建一個(gè)運(yùn)行的app時(shí),一個(gè)參數(shù)都不需要我們傳,無(wú)論是environ還是回調(diào)函數(shù)都由服務(wù)器,也就是wsgi server負(fù)責(zé)。
environenviron 包括 服務(wù)器環(huán)境變量,客戶端環(huán)境變量,和請(qǐng)求中的數(shù)據(jù)method,path等等。environ是怎么生成的呢?
wsgi server主要分為兩部分,server和handler。server監(jiān)聽端口,handler處理請(qǐng)求。server接受到一個(gè)request,解析客戶端environ,bind一個(gè)handler,handler解析請(qǐng)求,將請(qǐng)求信息放入environ,最后服務(wù)器端環(huán)境變量也放入environ中。這就是environ的全部了。
start_response
在wsgiref中,回調(diào)函數(shù)start_response的源碼是下面這樣的:
def start_response(self, status, headers,exc_info=None):
""""start_response()" callable as specified by PEP 333""" if exc_info: try: if self.headers_sent: # Re-raise original exception if headers sent raise exc_info[0], exc_info[1], exc_info[2] finally: exc_info = None # avoid dangling circular ref elif self.headers is not None: raise AssertionError("Headers already set!") assert type(status) is StringType,"Status must be a string" assert len(status)>=4,"Status must be at least 4 characters" assert int(status[:3]),"Status message must begin w/3-digit code" assert status[3]==" ", "Status message must have a space after code" if __debug__: for name,val in headers: assert type(name) is StringType,"Header names must be strings" assert type(val) is StringType,"Header values must be strings" assert not is_hop_by_hop(name),"Hop-by-hop headers not allowed" self.status = status self.headers = self.headers_class(headers) return self.write
函數(shù)接受兩個(gè)參數(shù),status,也就是HTTP狀態(tài)碼,和headers,請(qǐng)求頭。函數(shù)驗(yàn)證這兩個(gè)信息,并將其塞入服務(wù)器。最后調(diào)用write方法,write方法的功能是“to buffer data for send to client”,也就是把信息再塞回客戶端。
說(shuō)到這,我們就可以看看一個(gè)在PEP3333中給出的簡(jiǎn)單的wsgi app了。
HELLO_WORLD = b"Hello world!n"
def simple_app(environ, start_response): """Simplest possible application object""" status = "200 OK" response_headers = [("Content-type", "text/plain")] start_response(status, response_headers) return [HELLO_WORLD]
如上所述,兩個(gè)參數(shù),environ, start_response, 回調(diào)函數(shù)start_response傳入status和headers,最后返回一個(gè)字符串,也就是服務(wù)器返回給客戶端的核心數(shù)據(jù)。
同樣,我們說(shuō)過(guò),一個(gè)wsgi application是一個(gè)callable對(duì)象,只要他是callable(實(shí)現(xiàn)__call__方法)的就可以。在PEP3333中也給出了一個(gè)簡(jiǎn)單的類形式的app:
class AppClass:
def __call__(self, environ, start_response): status = "200 OK" response_headers = [("Content-type", "text/plain")] start_response(status, response_headers) return [HELLO_WORLD]
到這,其實(shí)wsgi的結(jié)構(gòu)很清晰了,最后,還差一個(gè)wsgi middleware。
middleware
按照PEP3333的說(shuō)法,wsgi server是server端的東西,wsgi app是應(yīng)用端的東西,并不是說(shuō)middleware是中間的東西,middleware是一個(gè)兩頭兼顧的東西。
我們可以把a(bǔ)pp看成一個(gè)蛋糕,middleware則是這塊蛋糕的包裝。web服務(wù)中,例如session,route,auth等等,都是用middleware實(shí)現(xiàn)的。
例如一個(gè)PEP3333中的這個(gè)轉(zhuǎn)換piglatin的wsgi middleware:
from piglatin import piglatin
class LatinIter:
"""Transform iterated output to piglatin, if it"s okay to do so Note that the "okayness" can change until the application yields its first non-empty bytestring, so "transform_ok" has to be a mutable truth value. """ def __init__(self, result, transform_ok): if hasattr(result, "close"): self.close = result.close self._next = iter(result).__next__ self.transform_ok = transform_ok def __iter__(self): return self def __next__(self): if self.transform_ok: return piglatin(self._next()) # call must be byte-safe on Py3 else: return self._next()
class Latinator:
# by default, don"t transform output transform = False def __init__(self, application): self.application = application def __call__(self, environ, start_response): transform_ok = [] def start_latin(status, response_headers, exc_info=None): # Reset ok flag, in case this is a repeat call del transform_ok[:] for name, value in response_headers: if name.lower() == "content-type" and value == "text/plain": transform_ok.append(True) # Strip content-length if present, else it"ll be wrong response_headers = [(name, value) for name, value in response_headers if name.lower() != "content-length" ] break write = start_response(status, response_headers, exc_info) if transform_ok: def write_latin(data): write(piglatin(data)) # call must be byte-safe on Py3 return write_latin else: return write return LatinIter(self.application(environ, start_latin), transform_ok)
middleware與函數(shù)裝飾器很像。
最后,一個(gè)應(yīng)用的middleware不止一層,middleware可能像下面一樣工作:
def configure(app): return ErrorHandlerMiddleware( SessionMiddleware( IdentificationMiddleware( AuthenticationMiddleware( UrlParserMiddleware(app))))))webframework
最后我們來(lái)看webframework,現(xiàn)在回想一下包括Django,F(xiàn)lask等框架,我們可以察覺(jué)出Python的web框架并不是特別的難以搭建。在4年前,第一個(gè)版本的Flask,只有短短600行代碼,并且其中充斥著大量的注釋(文檔)。
一般來(lái)說(shuō),一個(gè)python的webframework需要一個(gè)wsgi工具集(werkzeug, webob(pylons)),一個(gè)模板渲染引擎(mako,jinja2)和一個(gè)ORM數(shù)據(jù)庫(kù)工具集(sqlalchemy),還有其他的包括dispatcher,mail,json等支持,這樣我們可以膠合一個(gè)自己的框架。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/40680.html
摘要:系統(tǒng)安裝部署環(huán)境教程第一安裝依賴環(huán)境在準(zhǔn)備安裝框架部署之前,我們需要先安裝依賴環(huán)境,因?yàn)榭赡苣J(rèn)的環(huán)境沒(méi)有完善的最新部署包。檢查最新版本的數(shù)據(jù)庫(kù),然后部署安裝。到目前為止,我們已經(jīng)成功的在環(huán)境中部署了應(yīng)用程序,以及。 Django,是一款針對(duì)Python環(huán)境的WEB開發(fā)框架,能夠幫助我們構(gòu)架快捷、簡(jiǎn)單的WEB框架設(shè)置,Django框架非常適合開發(fā)內(nèi)容應(yīng)用環(huán)境,所以在本文中,麥子將整理基...
摘要:先在服務(wù)器上安裝配置好下載地址將下載好的文件上傳至服務(wù)器解壓安裝下載頁(yè)面有說(shuō)明注意看一下滿足沒(méi)有有種安裝方式一種是直接安裝到一種是安裝到這里先采用第一種直接安裝到進(jìn)入下載的文件目錄常規(guī)安裝先然后最后因?yàn)槲沂亲约捍畹姆?wù)器而且是版所以很多軟件 先在linux服務(wù)器上安裝, 配置好apache 下載wsgi, 地址: https://pypi.python.org/pypi/mod_ws...
摘要:提出這些規(guī)范的目的就是為了定義統(tǒng)一的標(biāo)準(zhǔn),提升程序的可移植性。的對(duì)象處理完成后,會(huì)調(diào)用并且返回結(jié)果給,存放在中。比如可以檢查是否有非法內(nèi)容,檢查是否有非法內(nèi)容,為加上特定的等,這些都是可以的。的實(shí)現(xiàn)和部署要使用,需要分別實(shí)現(xiàn)角色和角色。 WSGI是什么 WSGI的全稱是Web Server Gateway Interface,翻譯過(guò)來(lái)就是Web服務(wù)器網(wǎng)關(guān)接口。具體的來(lái)說(shuō),WSGI是一個(gè)...
摘要:最新的工作中,有一部分的任務(wù),于是開始折騰先惡補(bǔ)理論吧,關(guān)于有篇需要看,和,前者是年的提案,后者在年對(duì)前者做了小幅修訂,提案狀態(tài)也已經(jīng)是,所以已經(jīng)不是提案,已經(jīng)是協(xié)議規(guī)范了,是的縮寫,解決的是各種比如與各種框架比如之間互聯(lián)互通的兼容性問(wèn)題如 最新的工作中,有一部分HTTP API的任務(wù),于是開始折騰Python WSGI... WSGI 先惡補(bǔ)理論吧,關(guān)于Python WSGI有2...
摘要:一般來(lái)說(shuō),這一例行程序用于處理請(qǐng)求的每一部分,例如把路徑作為一系列字典鍵值進(jìn)行處理。,必須是按照中所規(guī)定地鍵值元組列表。行為時(shí)回車換行。這個(gè)包裝器也可能用模塊指明那些有問(wèn)題的,但不完全違反的行為。 wsgirf-WSGI功能及參考實(shí)現(xiàn) 源碼:Lib/wsgiref Web服務(wù)器網(wǎng)關(guān)接口(Web Server Gateway Interface, WSGI),是用Python寫的一個(gè)服務(wù)...
閱讀 1599·2023-04-25 17:41
閱讀 3107·2021-11-22 15:08
閱讀 911·2021-09-29 09:35
閱讀 1676·2021-09-27 13:35
閱讀 3400·2021-08-31 09:44
閱讀 2772·2019-08-30 13:20
閱讀 2008·2019-08-30 13:00
閱讀 2619·2019-08-26 12:12