13

我想在中间件中访问 request.url。

烧瓶应用程序 - 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 应用程序对象。

我该如何进行?

谢谢你的帮助..

4

3 回答 3

15

构造请求对象的是应用程序对象:在调用应用程序之前它不存在,因此中间件无法事先查看它。但是,您可以在中间件中构建自己的请求对象(直接使用 Werkzeug 而不是 Flask):

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

您甚至可以用flask.wrappers.Request同样的方式构造 Flask 自己的 Request 对象( ,它是 Werkzeug 的 Request 类的子类)。查看源代码,我没有看到任何可以阻止您这样做的东西,但是由于它的设计目的不是以这种方式使用,因此您最好还是坚持使用 Werkzeug,除非您需要添加的额外属性之一通过 Flask 的子类。

于 2013-09-02T13:38:55.567 回答
7

中间件位于你的WSGI server和之间Flask Application。该request对象是在Flask Application. 所以request中间件中没有任何对象。

也许您需要一个@before_request在您的视图之前调用的处理程序?

于 2013-09-02T13:32:07.883 回答
0

Request在应用程序找到 URL 规则并创建它之前,您不能拥有对象。但是,在应用程序完成它的事情后,您可以Request在以下位置找到对象environ

environ['werkzeug.request']
于 2020-01-28T12:56:19.253 回答