我想在中间件中访问request.url。
Flask app - 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()
middleware.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 app对象。
我该如何处理?
感谢您的帮助..
答案 0 :(得分:8)
它是构造请求对象的应用程序对象:它在调用app之前不存在,因此中间件无法事先查看它。但是,您可以在中间件中构建自己的请求对象(直接使用Werkzeug而不是Flask):
from werkzeug.wrappers import Request
req = Request(environ, shallow=True)
您甚至可以以相同的方式构造Flask自己的Request对象(flask.wrappers.Request
,它是Werkzeug的Request类的子类)。看the source我没有看到任何阻止你这样做的东西,但是因为它不是那样设计的,你可能最好不要使用Werkzeug,除非你需要其中一个Flask的子类添加了额外的属性。
答案 1 :(得分:3)
中间件位于WSGI server
和Flask Application
之间。 request
对象是在Flask Application
中创建的。所以中间件中没有任何request
对象。
也许您需要在视图之前调用@before_request
处理程序?
答案 2 :(得分:0)
在应用程序找到并创建URL规则之前,您不能拥有Request
对象。但是,应用程序完成其操作后,您可以在Request
中找到environ
对象:
environ['werkzeug.request']