2013-09-02 19 views
6

middleware'de request.url adresine erişmek istiyorum.Flask MIddleware'deki istek nasıl erişilir

Flask uygulaması - 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) 

Ben isteği Flask uygulama bağlamında erişilebilir anlıyoruz. Biz normalde, Flask uygulama nesnesine erişimim yok.

Nasıl devam ederim? Herhangi bir yardım için

Teşekkür ..

+0

Sadece uygulama nesnesini ara katman yazılımına aktarın ve ona erişebileceksiniz: 'app.wsgi_app = TestMiddleware (app.wsgi_app, app)' – kaka

cevap

8

İstek nesnesini oluşturan uygulama nesnesi: uygulama çağrılana kadar mevcut değil, bu nedenle ara katman yazılımına daha önce bakmanın yolu yok.

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

Hatta werkzeug en Request bir alt sınıfıdır şişesi kendi isteği nesnesi (flask.wrappers.Request, inşa etmek mümkün olabilir: Ancak, (doğrudan değil Flask daha Werkzeug kullanarak) katman içinde kendi isteği nesnesi oluşturabilirsiniz sınıf) aynı şekilde. the source'a bakıyorum Bunu yapmanı engellemem gereken bir şey görmüyorum, ama bu şekilde kullanılacak şekilde tasarlanmadığından, Werkzeug'la yapışma olasılığınız en yüksek olanıdır. Flask'in alt sınıfı.

+1

'' res' işlevini kullanmak bazı akışların tükenmesine neden olabilir. Http://stackoverflow.com/a/17828333/1544347 adresine bakın. –

3

Ara Katman WSGI server ve Flask Application senin arasında duruyor. request nesnesi Flask Application'da oluşturulur. Dolayısıyla, ara yazılımda request nesnesi yok.

Belki de görüşünüzden hemen önce çağrılan bir @before_request işleyicisine mi ihtiyacınız var?