亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Python WSGI

lingdududu / 1764人閱讀

摘要:在實(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é)。

environ

environ 包括 服務(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

相關(guān)文章

  • CentOS 5系統(tǒng)安裝Django、Apache 、mod_wsgi部署Python環(huán)境教程

    摘要:系統(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)境,所以在本文中,麥子將整理基...

    褰辯話 評(píng)論0 收藏0
  • Linux下 apache 配置 wsgi 以使用 python-flask (2016年2月)

    摘要:先在服務(wù)器上安裝配置好下載地址將下載好的文件上傳至服務(wù)器解壓安裝下載頁(yè)面有說(shuō)明注意看一下滿足沒(méi)有有種安裝方式一種是直接安裝到一種是安裝到這里先采用第一種直接安裝到進(jìn)入下載的文件目錄常規(guī)安裝先然后最后因?yàn)槲沂亲约捍畹姆?wù)器而且是版所以很多軟件 先在linux服務(wù)器上安裝, 配置好apache 下載wsgi, 地址: https://pypi.python.org/pypi/mod_ws...

    binaryTree 評(píng)論0 收藏0
  • WSGI簡(jiǎn)介

    摘要:提出這些規(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è)...

    Harpsichord1207 評(píng)論0 收藏0
  • Hello, WSGI

    摘要:最新的工作中,有一部分的任務(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...

    array_huang 評(píng)論0 收藏0
  • 通讀Python官方文檔之wsgiref(未完成)

    摘要:一般來(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ù)...

    mumumu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<