您好,登錄后才能下訂單哦!
這篇文章主要介紹關(guān)于WSGI與Werkzeug的詳細(xì)用法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
在介紹Werkzeug之前,先介紹一下 WSGI(Python Web Server Gateway Interface),它為Python語言定義的Web服務(wù)器和Web應(yīng)用程序或框架之間的一種簡單而通用的接口。
WSGI 分為兩個(gè)部分:
可以通過下面兩張圖片來梳理一下它們之間的調(diào)用關(guān)系:
先從一份示例代碼理解:
def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) return ['Hello World!']
一個(gè)最基本的 WSGI 應(yīng)用就是如上所示,定義了一個(gè) application 函數(shù)(callable object),callable object(可調(diào)用對(duì)象) 包括: 一個(gè)函數(shù)、方法、類或一個(gè)實(shí)現(xiàn)了__call__
的實(shí)例都可以用作應(yīng)用程序?qū)ο?。這個(gè)函數(shù)接受兩個(gè)參數(shù),分別是environ和start_response。
通過回調(diào)函數(shù)(start_response)將響應(yīng)狀態(tài)和響應(yīng)頭返回給 server,同時(shí)返回響應(yīng)正文(response body),響應(yīng)正文是可迭代的、并包含了多個(gè)字符串。
werkzeug 提供了 python web WSGI 開發(fā)相關(guān)的功能:
下面使用 Werkzeug 來實(shí)現(xiàn)一個(gè)簡單的WSGI應(yīng)用:
from werkzeug.wrappers import Request, Response def application(environ, start_response): request = Request(environ) text = 'Hello %s!' % request.args.get('name', 'World') response = Response(text, mimetype='text/plain') return response(environ, start_response)
如上代碼所示,請(qǐng)求數(shù)據(jù)需要環(huán)境對(duì)象,Werkzeug允許你以一個(gè)輕松的方式訪問數(shù)據(jù)。響應(yīng)對(duì)象是一個(gè) WSGI 應(yīng)用,提供了更好的方法來創(chuàng)建響應(yīng)。
具體創(chuàng)建一個(gè) WSGI 應(yīng)用請(qǐng)查看文檔,后面會(huì)陸續(xù)提到Flask框架中使用到Werkzeug的數(shù)據(jù)結(jié)構(gòu)。這里貼一些官方文檔的例子,使用werkzeug創(chuàng)建一個(gè)web 應(yīng)用:
import os import redis import urlparse from werkzeug.wrappers import Request, Response from werkzeug.routing import Map, Rule from werkzeug.exceptions import HTTPException, NotFound from werkzeug.wsgi import SharedDataMiddleware from werkzeug.utils import redirect from jinja2 import Environment, FileSystemLoader class Shortly(object): """ Shortly 是一個(gè)實(shí)際的 WSGI 應(yīng)用,通過 __call__ 方法直接調(diào) 用 wsgi_app, 同時(shí)通過一個(gè)可選設(shè)置創(chuàng)建一個(gè)中間件,將static文件夾暴露給用戶: """ def __init__(self, config): self.redis = redis.Redis(config['redis_host'], config['redis_port']) def dispatch_request(self, request): return Response('Hello World!') def wsgi_app(self, environ, start_response): request = Request(environ) response = self.dispatch_request(request) return response(environ, start_response) def __call__(self, environ, start_response): return self. wsgi_app(environ, start_response) def create_app(redis_host='localhost', redis_port=6379, with_static=True): app = Shortly({ 'redis_host': redis_host, 'redis_port': redis_port }) if with_static: app.wsgi_app = SharedDataMiddleware(app.wsgi_app, { '/static': os.path.join(os.path.dirname(__file__), 'static') }) return app if __name__ == '__main__': from werkzeug.serving import run_simple app = create_app() run_simple('127.0.0.1', 5000, app, use_debugger=True, use_reloader=True)
思路很簡單,我們的 Shortly 是一個(gè)實(shí)際的 WSGI 應(yīng)用。 __call__
方法直接調(diào)用 wsgi_app 。這樣做我們可以裝飾 wsgi_app 調(diào)用中間件,就像我們?cè)?create_app 函數(shù)中做的一樣。
wsgi_app 實(shí)際上創(chuàng)建了一個(gè) Request 對(duì)象,之后通過 dispatch_request 調(diào)用 Request 對(duì)象然后給 WSGI 應(yīng)用返回一個(gè) Response 對(duì)象。正如你看到的:無論是創(chuàng)建 Shortly 類,還是創(chuàng)建 Werkzeug Request 對(duì)象來執(zhí)行 WSGI 接口。最終結(jié)果只是從 dispatch_request 方法返回另一個(gè) WSGI 應(yīng)用。這部分解釋來源于官方文檔的中文版。
以上是關(guān)于WSGI與Werkzeug的詳細(xì)用法的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。