1

私の App Engine アプリケーションには、カスタム ユーザー モデルがあります。このモデルは、アプリケーション コードで頻繁にアクセスされます。リクエストが処理される前に、各認証済みリクエストにモデル インスタンスを挿入することで、コードを簡素化したいと考えています ( process_requestDjango ミドルウェア クラスのメソッドと同様)。

フレームワークとして webapp2 で App Engine Python2.7 標準ランタイムを使用しています。

WSGI 環境ディクショナリを変更し、ミドルウェアを追加するwebapp_add_wsgi_middleware関数を定義する WSGI ミドルウェア callable を作成しようとしましたappengine_config.pyが、リクエストがアプリによって処理されるまでミドルウェアは実行されませんでした。

アプリケーションによって処理される前にリクエストを変更するにはどうすればよいですか?

4

1 に答える 1

2

私が見つけた解決策は、サブクラスを作成し、スーパークラスを呼び出してアプリを実行する前に辞書webapp2.WSGIApplicationを変更することでした。environインスタンスを Request.environ 経由でアクセスするのではなく、リクエストの属性として設定するために、environ'webob.adhoc_attrs' 値に追加しました。これは、webapp2 の Request クラスが webob から継承され、webobが属性アクセスを管理するmixin クラスから継承されるためです。

すべてのリクエストに属性を設定するアプリケーションの例を次に示します。

import webapp2


class Handler(webapp2.RequestHandler):

    def get(self):
        try:
            foo = self.request.foo
        except AttributeError:
            foo = 'Default'
        self.response.write('Hello %s' % foo)


routes = [('/', Handler)]


class MyWSGIApplication(webapp2.WSGIApplication):

    def __call__(self, environ, start_response):
        adhoc_attrs = {'foo': 'Foo'}
        if 'webob.adhoc_attrs' in environ:
            environ['webob.adhoc_attrs'].update(adhoc_attrs)
        else:
            environ['webob.adhoc_attrs'] = adhoc_attrs
        return super(MyWSGIApplication, self).__call__(environ, start_response)


app = MyWSGIApplication(routes)
于 2018-03-03T10:33:22.340 に答える