亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

關于WSGI與Werkzeug的詳細用法

發布時間:2020-07-02 15:25:20 來源:億速云 閱讀:346 作者:清晨 欄目:編程語言

這篇文章主要介紹關于WSGI與Werkzeug的詳細用法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

      在介紹Werkzeug之前,先介紹一下 WSGI(Python Web Server Gateway Interface),它為Python語言定義的Web服務器和Web應用程序或框架之間的一種簡單而通用的接口。

       關于WSGI與Werkzeug的詳細用法

WSGI 分為兩個部分:

  • Server/Gateway: 即是HTTP Server, 負責從客戶端(Nnginx、apache、IIS)接收請求,將 request 轉發給 application, 并將 application(可能是個Flask應用) 返回的response 返回給客戶端
  • Application/Framework: 一個python web 應用或 web 框架接收由 server 轉發的request,處理請求,并將處理結果返回給 server

可以通過下面兩張圖片來梳理一下它們之間的調用關系:

關于WSGI與Werkzeug的詳細用法

關于WSGI與Werkzeug的詳細用法

先從一份示例代碼理解:

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return ['Hello World!']

      一個最基本的 WSGI 應用就是如上所示,定義了一個 application 函數(callable object),callable object(可調用對象) 包括: 一個函數、方法、類或一個實現了__call__的實例都可以用作應用程序對象。這個函數接受兩個參數,分別是environ和start_response。

  • environ是一個字典包含了CGI中的環境變量
  • start_response也是一個callable,接受兩個必須的參數,status(HTTP狀態)和response_headers(響應消息的頭)

      通過回調函數(start_response)將響應狀態和響應頭返回給 server,同時返回響應正文(response body),響應正文是可迭代的、并包含了多個字符串。

Werkzeug


werkzeug 提供了 python web WSGI 開發相關的功能:

  • 路由處理:如何根據請求 URL 找到對應的視圖函數
  • request 和 response 封裝: 提供更好的方式處理request和生成response對象
  • 自帶的 WSGI server: 測試環境運行WSGI應用

下面使用 Werkzeug 來實現一個簡單的WSGI應用:

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)

       如上代碼所示,請求數據需要環境對象,Werkzeug允許你以一個輕松的方式訪問數據。響應對象是一個 WSGI 應用,提供了更好的方法來創建響應。

       具體創建一個 WSGI 應用請查看文檔,后面會陸續提到Flask框架中使用到Werkzeug的數據結構。這里貼一些官方文檔的例子,使用werkzeug創建一個web 應用:

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 是一個實際的 WSGI 應用,通過 __call__ 方法直接調 用 wsgi_app,
    同時通過一個可選設置創建一個中間件,將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 是一個實際的 WSGI 應用。 __call__ 方法直接調用 wsgi_app 。這樣做我們可以裝飾 wsgi_app 調用中間件,就像我們在 create_app 函數中做的一樣。 

       wsgi_app 實際上創建了一個 Request 對象,之后通過 dispatch_request 調用 Request 對象然后給 WSGI 應用返回一個 Response 對象。正如你看到的:無論是創建 Shortly 類,還是創建 Werkzeug Request 對象來執行 WSGI 接口。最終結果只是從 dispatch_request 方法返回另一個 WSGI 應用。這部分解釋來源于官方文檔的中文版。

以上是關于WSGI與Werkzeug的詳細用法的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

陇川县| 黑龙江省| 永新县| 绥化市| 临夏县| 双辽市| 汶上县| 南投县| 丰原市| 吐鲁番市| 大埔区| 娱乐| 汉中市| 济阳县| 抚顺市| 满城县| 松滋市| 辽源市| 桐梓县| 凤庆县| 民乐县| 海安县| 大理市| 阿巴嘎旗| 晋宁县| 皋兰县| 怀宁县| 临高县| 九台市| 漠河县| 临颍县| 南澳县| 久治县| 临泽县| 宿松县| 铜陵市| 绥化市| 南汇区| 玛多县| 华蓥市| 招远市|