簡體   English   中英

如何在 Flask 中間件中訪問請求

[英]How to access request in Flask Middleware

我想在中間件中訪問 request.url。

Flask 應用程序 - test.py

from flask import Flask
from middleware import TestMiddleware
app = Flask(__name__)

app.wsgi_app = TestMiddleware(app.wsgi_app)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

中間件.py:

from flask import request

class TestMiddleware(object):

    def __init__(self, app):
        self.app = app 

    def __call__(self, environ, start_response):
        # How do I access request object here.
        print "I'm in middleware"
        return self.app(environ, start_response)

我知道可以在 Flask 應用程序上下文中訪問請求。 我們通常使用

with app.test_request_context()

但是在中間件中,我無權訪問 Flask 應用程序對象。

我該如何進行?

謝謝你的幫助..

它是構建請求對象的應用程序對象:它在應用程序被調用之前不存在,因此中間件無法事先查看它。 但是,您可以在中間件中構建自己的請求對象(直接使用 Werkzeug 而不是 Flask):

from werkzeug.wrappers import Request
req = Request(environ, shallow=True)

您甚至可以以同樣的方式構造 Flask 自己的 Request 對象( flask.wrappers.Request ,它是 Werkzeug 的 Request 類的子類)。 查看源代碼,我沒有看到任何可以阻止您這樣做的內容,但是由於它不是設計為以這種方式使用的,因此您最好堅持使用 Werkzeug ,除非您需要添加額外的屬性之一通過 Flask 的子類。

中間件介於WSGI serverFlask Application request對象是在Flask Application創建的。 所以中間件中沒有任何request對象。

也許您需要在視圖之前調用一個@before_request處理程序?

在應用程序找到 URL 規則並創建它之前,您不能擁有Request對象。 但是,在應用程序完成其操作后,您可以在environ找到Request對象:

environ['werkzeug.request']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM