2013-09-02 4 views
6

미들웨어의 request.url에 액세스하고 싶습니다.Flask MIddleware에서 요청에 액세스하는 방법

플라스크 응용 프로그램 - 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) 

내가 요청이 플라스크 응용 프로그램 컨텍스트에서 액세스 할 수 있습니다 이해합니다. 우리는 일반적으로 사용합니다

with app.test_request_context() 

하지만 미들웨어에서는 Flask 앱 객체에 액세스 할 수 없습니다.

어떻게 진행합니까? 어떤 도움

덕분에 ..

+0

app 객체를 미들웨어에 전달하면 액세스 할 수 있습니다.'app.wsgi_app = TestMiddleware (app.wsgi_app, app) ' – kaka

답변

8

요청 개체를 구성하는 응용 프로그램 개체입니다. 응용 프로그램이 호출 될 때까지 존재하지 않으므로 미들웨어가 미리 볼 수있는 방법이 없습니다.

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

심지어 WERKZEUG의 요청의 서브 클래스입니다 플라스크 자신의 Request 객체 (flask.wrappers.Request를 구성 할 수 있습니다 당신은, 그러나, (직접 오히려 플라스크보다 WERKZEUG 사용) 미들웨어 내에서 자신의 요청 객체를 생성 할 수 있습니다 클래스) 같은 방법으로. 보고있는 것은 the source입니다. 저는이 일에서 여러분을 막아야 할 것이 아무것도 보이지 않지만, 그런 식으로 사용하도록 고안되지 않았기 때문에, 여러분이 추가 한 속성 중 하나가 필요하지 않다면 Werkzeug를 사용하는 것이 가장 좋을 것입니다. 플라스크의 하위 클래스.

+1

''res''를 사용하면 일부 스트림이 고갈 될 수 있습니다. http://stackoverflow.com/a/17828333/1544347을 참조하십시오. –

3

미들웨어 WSGI serverFlask Application 당신의 사이에 서있다. request 개체는 Flask Application에 생성됩니다. 따라서 미들웨어에는 request 개체가 없습니다.

아마보기 전에 호출 된 @before_request 처리기가 필요합니까?

관련 문제