5

フラスコアプリをロードする前に、wsgiリクエストからいくつかの値を読み取る必要があります。wsgiリクエストからURLを読み取ると、フラスコアプリが読み込まれると(ミドルウェアの実行後)、問題なくファイルにアクセスできます。

しかし、パラメータにアクセスしようとすると、フラスコアプリが読み込まれると投稿データが削除されるようです。この「一度だけ読む」問題を防ぐために、wsgiリクエストを特別なWebobリクエストでラップするという極端なこともしました。

ミドルウェアでwsgiリクエストの値にアクセスする方法を知っている人はいますか?リクエストに副作用を与えることなく、フラスコアプリで投稿データ/ファイルデータを取得できますか?

from webob import Request

class SomeMiddleware(object):

    def __init__(self, environ):
        self.request = Request(environ)
        self.orig_environ = environ

    def apply_middleware(self):
        print self.request.url #will not do any harm
        print self.request.params #will cause me to lose data

これが私のフラスコビューです

    @app.route('/')
    def hello_world():
        from flask import request
        the_file = request.files['file']
        print "and the file is", the_file
4

1 に答える 1

3

私が知る限り、これは WSGI の動作の制限です。ストリームは1 回だけ消費可能である必要があります( PEP 333および3333は、ストリーム サポートread*呼び出しのみを必要とし、サポートtellする必要はありません)。ストリームが使い果たされると、さらに「内側」にある他の WSGI アプリケーションに再ストリームすることはできません。詳細については、Werkzeug のドキュメントの次の 2 つのセクションを参照してください。

  1. http://werkzeug.pocoo.org/docs/request_data/
  2. http://werkzeug.pocoo.org/docs/http/#module-werkzeug.formparser

この問題を回避するには、およびメソッドを実装するオブジェクトで入力ストリーム( ) をラップします。次に、チェーンの最後のアプリケーションが実際にストリームを使い切ろうとしたときにのみ、メソッドが実行されます。このパターンの例については、要求チェックサムの生成に関する Flask のドキュメントを参照してください。wsgi.inputreadreadline

そうは言っても、ミドルウェアが問題の最善の解決策であると確信していますか? リクエストの本文の内容に基づいて何らかのアクション (ディスパッチ、ロギング、認証) を実行する必要がある場合は、それ自体をスタンドアロン アプリケーションにするよりも、アプリケーションの一部にする方がよい場合があります。

于 2012-10-28T02:53:49.007 に答える