2013-09-02 3 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) 

Iが要求フラスコアプリケーション・コンテキストにアクセスすることができ理解します。私たちは通常使用します

with app.test_request_context() 

しかしミドルウェアでは、私はFlaskアプリケーションオブジェクトにアクセスできません。

どうすればいいですか?任意の助け

おかげで..

+0

アプリケーションオブジェクトをミドルウェアに渡すだけでアクセスできます。 '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に固執するのが一番良いでしょう。 Flaskのサブクラスです。

+1

'' res''を使用すると、いくつかのストリームが使い果たされる可能性があります。 http://stackoverflow.com/a/17828333/1544347を参照してください。 –

3

ミドルウェアWSGI serverFlask Applicationあなたの間で立っています。 requestオブジェクトはFlask Applicationに作成されます。したがって、ミドルウェアにはrequestオブジェクトはありません。

おそらく、あなたのビューの直前に呼ばれる@before_requestハンドラが必要でしょうか?

関連する問題