首頁 >科技週邊 >IT業界 >Python Web應用程序:WSGI的基礎知識

Python Web應用程序:WSGI的基礎知識

Joseph Gordon-Levitt
Joseph Gordon-Levitt原創
2025-02-18 11:40:08582瀏覽

Python Web應用程序:WSGI的基礎知識

鑰匙要點

    WSGI或Web服務器網關接口,基於所有Python Web框架,為Web服務器提供了一個常見的規範,該規範允許在不同的Web服務器和應用程序框架之間進行交互。
  • > wsgi應用程序是一個可調用的python,必須接受兩個參數,即環境(一個包含請求數據的python dict)和start_fn(可召喚)。該應用程序必須使用兩個參數調用start_fn:狀態代碼和標題列表,並返回包含響應主體中字節的值 中間件可用於擴展WSGI應用程序的功能,中間件和處理程序不需要相互了解或關心。這使得添加諸如日誌記錄或錯誤處理之類的功能變得容易。
  • > WSGI應用程序可以通過多種方式提供,槍支和UWSGI是兩個流行的選擇。建議在這些面前設置類似Nginx的東西以提供靜態資產。 >
  • 在Django,燒瓶,瓶子和其他所有Python Web框架之下,在Web Server網關接口或WSGI中,簡稱為空。 WSGI將Python python對Java的服務是什麼 - Web服務器的常見規範,允許不同的Web服務器和應用程序框架基於共同的API進行交互。但是,與大多數內容一樣,Python版本非常簡單。 PEP 3333中定義了
  • wsgi,如果您想要更多信息,我鼓勵您作為參考閱讀。
  • >本文將從應用程序開發人員的角度向您介紹WSGI規格,並向您展示如何直接與WSGI合作以創建應用程序(如果您願意的話)。
  • 您的第一個WSGI應用
這是可能的最基本的python Web應用程序:Python Web應用程序:WSGI的基礎知識

就是這樣!整個文件。稱其為app.py並使用任何與WSGI兼容的服務器運行,您將獲得200個狀態的Hello World響應。您可以使用槍龍;只需通過PIP(PIP安裝槍支)安裝它,然後使用Gunicorn App:App運行它。該命令告訴Gunicorn在應用模塊中的App變量中獲取WSGI可呼叫。

>現在,您應該非常興奮。一個運行應用程序只有3行?那一定是某種記錄(因為mod_php正在作弊,禁止PHP)。我敢打賭,您只是想了解更多。

>

那麼,WSGI應用程序的重要部分是什麼?

  • wsgi應用程序是一個pythoncallable,例如函數,類或類實例,帶有__call __方法
  • 應用程序必須接受兩個參數:環境,這是包含請求數據的python dict,並且start_fn,本身是一個可召喚的。
  • >應用程序必須使用兩個參數調用start_fn:狀態代碼(作為字符串),以及以2個tuples表示的標題列表。
  • >應用程序返回一個可互動的,該字符在響應主體中,方便,可流的塊 - 在這種情況下,列出了包含“ Hello,World!”的字符串列表。 (如果應用程序是類,則可以在__ITER__方法中完成。
  • 例如

>您可能已經在考慮可以使用此信息的方法,但最相關的信息可能是編寫中間Wares。

爵士樂
<span>def app(environ, start_fn):
</span>    start_fn<span>('200 OK', [('Content-Type', 'text/plain')])
</span>    <span>return ["Hello World!\n"]
</span>
<span>class app(object):
</span>
    <span>def __init__(self, environ, start_fn):
</span>        self<span>.environ = environ
</span>        self<span>.start_fn = start_fn
</span>
    <span>def __iter__(self):
</span>        self<span>.start_fn('200 OK', [('Content-Type', 'text/plain')])
</span>        <span>yield "Hello World!\n"
</span>
中間Wares是擴展WSGI應用程序功能的簡便方法。由於您只需要提供一個可可,因此您可以將其包裝在其他功能中。 例如,

,說我們要檢查環境的內容。我們可以輕鬆地創建一個中間件來這樣做,如此示例:

>在這裡,log_environ是一個返回函數的函數,在推遲到原始回調之前,它可以很好地打印到環境參數。

以這種方式編寫中間的優點是中間件和處理程序不必彼此了解或關心。例如,您可以輕鬆地將log_environ固定到燒瓶應用程序上,例如,燒瓶應用程序是WSGI應用程序。

其他一些有用的中間件想法:

<span>class Application(object):
</span>    <span>def __call__(self, environ, start_fn):
</span>        start_fn<span>('200 OK', [('Content-Type', 'text/plain')])
</span>        <span>yield "Hello World!\n"
</span>
app <span>= Application()
</span>

>如果您不想使大金字塔成為文件的底部,則可以使用Reled來一次應用一堆中間件:

>您還可以通過利用start_fn參數來編寫修改響應的中間件。這是一個中間件,如果內容類型標頭為文本/平原,則可以逆轉輸出:

>由於start_fn和響應的分離,這有點糾結,但仍然完全可行。
<span>import pprint
</span>

<span>def handler(environ, start_fn):
</span>    start_fn<span>('200 OK', [('Content-Type', 'text/plain')])
</span>    <span>return ["Hello World!\n"]
</span>

<span>def log_environ(handler):
</span>    <span>def _inner(environ, start_fn):
</span>        pprint<span>.pprint(environ)
</span>        <span>return handler(environ, start_fn)
</span>    <span>return _inner
</span>

app <span>= log_environ(handler)
</span>
>

還要注意,要嚴格與WSGI符合規格,我們必須在響應上檢查A

> CLOSE
<span>import pprint
</span>

<span>def handle_error(handler):
</span>    <span>def _inner(environ, start_fn):
</span>        <span>try:
</span>            <span>return handler(environ, start_fn)
</span>        <span>except Exception as e:
</span>            <span>print e  # Log error
</span>            start_fn<span>('500 Server Error', [('Content-Type', 'text/plain')])
</span>            <span>return ['500 Server Error']
</span>    <span>return _inner
</span>

<span>def wrap_query_params(handler):
</span>    <span>def _inner(environ, start_fn):
</span>        qs <span>= environ.get('QUERY_STRING')
</span>        environ<span>['QUERY_PARAMS'] = urlparse.parse_qs(qs)
</span>        <span>return handler(environ, start_fn)
</span>    <span>return _inner
</span>
方法,並在此處調用。傳統的WSGI應用程序也可以返回a

write

函數,而不是在調用處理程序後返回峰值。如果您希望您的中間件支持舊的應用程序,則可能需要處理這種情況。
<span># Applied from bottom to top on the way in, then top to bottom on the way out
</span>MIDDLEWARES <span>= [wrap_query_params,
</span>               log_environ<span>,
</span>               handle_error<span>]
</span>
app <span>= reduce(lambda h, m: m(h), MIDDLEWARES, handler)
</span>
>一旦您開始使用RAW WSGI稍微播放一點,您就會開始理解為什麼Python實際上擁有數十個網絡框架。 WSGI使從頭開始建立一些東西變得非常簡單。例如,您可能正在考慮路由的問題:

如果您享受組裝庫的靈活性,可以直接與WSGI合作可以很好

  • >模板庫:只需放入您喜歡的任何模板庫(例如Jinja2,pystashe),然後從處理程序中返回渲染模板!
  • >
  • >幫助您使用諸如路由或Werkzeug的路由之類的庫路由。實際上,如果您想在WSGI上使用越來越多的抽象,請看一下Werkzeug。
  • >使用燒瓶或類似的數據庫/遷移庫。
  • >
  • 當然,對於非專業應用程序,您可能仍然想使用一個框架,以便正確處理邊緣案例。
但是服務器呢?

>

有多種服務WSGI應用程序的方法。我們已經談到了槍支,這是一個不錯的選擇。 UWSGI是另一個不錯的選擇。只需確保您在這些方面設置了類似nginx的設置以提供靜態資產,並且您應該擁有一個可靠的起點。

就是一切!

>

經常詢問有關Python Web應用程序和WSGI

的問題(常見問題解答)

> WSGI在Python Web應用程序中的作用是什麼?

wsgi或Web服務器網關接口,是Web服務器和Web應用程序之間的標準接口。它在Python Web應用程序中起著至關重要的作用,因為它允許應用程序和Web服務器相互通信和發送請求。 WSGI充當橋樑,使Web服務器能夠將請求從客戶端(例如Web瀏覽器)轉發到Web應用程序。然後,該應用程序處理請求並通過Web服務器發送回复。 Web服務器與Web應用程序進行通信。當客戶端將請求發送到Web服務器時,服務器使用WSGI接口將請求傳遞給Web應用程序。該應用程序處理請求並返迴響應,然後服務器然後將其發送回客戶端。這個過程允許Web服務器和應用程序進行交互的一致和可靠的方式,無論其特定實現如何。

>

> python的一些流行的WSGI服務器是什麼?可用於Python,每種都有自己的優點和劣勢。一些最常用的包括槍,UWSGI和MOD_WSGI。 Gunicorn以其簡單性和易用性而聞名,而UWSGI則以其速度和效率而受到讚揚。另一方面,mod_wsgi是Apache服務器的模塊,通常用於企業環境中。

>如何使用WSGI?

>使用WSGI部署Python Web應用程序,涉及多個步驟。首先,您需要安裝WSGI服務器,例如Gunicorn或UWSGI。接下來,您需要配置Web服務器以使用WSGI服務器作為處理請求到應用程序的代理。這涉及修改服務器的配置文件以包括必要的WSGI設置。最後,您需要啟動WSGI服務器,並將其指向您的應用程序的WSGI文件。

>我可以將WSGI與Django一起使用?實際上,Django附帶了一個內置的WSGI應用程序,您可以用來部署Django項目。 Django WSGI應用程序充當您的Django項目和Web服務器之間的橋樑,允許他們交流和交換請求和響應。

>

> WSGI和ASGI和ASGI和ASGI? ASGI都是Python Web應用程序的接口,但它們的目的不同。 WSGI是一個同步接口,允許在Web服務器和Web應用程序之間進行通信。 ASGI或異步服務器網關接口是支持異步操作的WSGI的擴展。這意味著,使用ASGI,您的應用程序可以同時處理多個請求而不會阻止,從而使其在實時應用程序中更有效。

>

如何在Python中創建WSGI應用程序? >在Python中創建WSGI應用程序涉及定義一個接受兩個參數的函數:環境字典和start_response collable。環境字典包含有關傳入請求的信息,而start_response collable用於啟動對請求的響應。您的功能應該返回產生響應主體的效果。

>在python Web應用程序中使用WSGI有什麼好處?

>在Python Web應用程序中使用WSGI提供了一些好處。首先,它為Web服務器和應用程序提供了標準接口,使開發和部署Python Web應用程序變得更加容易。其次,它允許更大的靈活性,因為您可以從各種與WSGI兼容的服務器和應用程序中進行選擇。最後,它可以促進代碼可重複使用性,因為您可以將相同的WSGI應用程序與不同的服務器和中間件使用。

>

>我可以將WSGI與燒瓶使用WSGI?

是的,您可以將WSGI與燒瓶一起使用。實際上,範圍為WSGI應用程序,默認情況下是WSGI應用程序。當您創建燒瓶應用程序時,實際上您正在創建一個WSGI應用程序,燒瓶框架將使用該應用程序來處理傳入請求並發送響應。

> WSGI中間件是什麼?

> WSGI中間件是位於WSGI服務器和WSGI應用程序之間的組件。它可以處理請求在將申請和響應發送回客戶之前,然後再處理。中間件可用於實現各種功能,例如會話管理,URL路由和身份驗證。

以上是Python Web應用程序:WSGI的基礎知識的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn