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.environ包含 CGI 风格的环境变量。诸如 webapp(2) 之类的 WSGI 应用程序可能会从那里获取它们的信息(或不从那里获取信息,具体取决于容器),但欢迎它们——甚至可能——复制而不是引用原始数据。没有理由假设操作os.environ会影响您的 WSGI 应用程序,这样做是一个坏主意,原因如下:

  1. 它打破了抽象
  2. 它可能不是线程安全的
  3. 真恶心_

相反,直接修改请求对象(例如,通过分配给request.path),如果您必须 - 或者更好,将相关信息存储在您的子处理程序可以访问的请求处理程序的属性中。

于 2012-05-23T01:42:33.727 回答