0

私のGAEアプリではwebapp2.RequestHandler.initialize、リクエストに対してカスタムを行うために使用します。
数日前までの変更os.environ['PATH_INFO']は、RequestHandler での self.request.path の呼び出しに影響を与え、変更されたリクエスト パスを反映していました。(そして、これは SDK でも問題なく動作します)

今はもう機能しません。もちろん、それが原因で大きな問題を抱えています。これが特殊なケースである可能性があることは理解していますが、これが変更された理由は何ですか?

影響を受けるコード:

class BaseHandler(webapp2.RequestHandler):

    def initialize(self, request, response):    
        ns, path = get_namespace(os.environ)
        namespace_manager.set_namespace(ns)
        os.environ['namespace'] = ns

        # request.path reflects the incoming path

        path = os.environ.get('PATH_INFO')
        prefix = '/%s'%ns

        if ns and path.startswith(prefix):
            # the request.path has to be changed here...

            newpath = path[len(prefix):]
            # here i change the path_info in os.environ to the new 
            # path
            os.environ['PATH_INFO'] = newpath or '/'

        super(BaseHandler, self).initialize(request, response)

        # request.path and self.request.path here are still unchanged.
        # up to a few days ago here the path was reflecting the changes
4

1 に答える 1

1

os.environCGIスタイルの環境変数が含まれています。webapp(2)などのWSGIアプリケーションは、そこから情報を取得する場合がありますが(コンテナーによっては取得しない場合もあります)、元のデータを参照するのではなく、コピーすることを歓迎します。操作がWSGIアプリに影響を与えると想定する理由はありませos.environん。そうすることは、いくつかの理由から悪い考えです。

  1. 抽象化を破る
  2. スレッドセーフではない可能性があります
  3. それはただ厄介です

代わりに、リクエストオブジェクトを直接変更します(たとえば、に割り当てることによってrequest.path)。必要に応じて、サブハンドラーがアクセスできるリクエストハンドラーの属性に関連情報を格納します。

于 2012-05-23T01:42:33.727 に答える