webapp2,self.request.path在GAE上更改问题

时间:2012-05-22 17:56:21

标签: google-app-engine python-2.7 webapp2

在我的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

1 个答案:

答案 0 :(得分:1)

os.environ包含CGI样式的环境变量。诸如webapp(2)之类的WSGI应用程序可以从那里(或不是,取决于容器)获取它们的信息,但是它们是受欢迎的 - 甚至可能 - 是复制而不是引用原始数据。没有理由认为操纵os.environ会影响您的WSGI应用程序,并且出于以下几个原因这样做是个坏主意:

  1. 它打破了抽象
  2. 可能不是线程安全
  3. 这只是讨厌的
  4. 相反,直接修改请求对象(例如,通过分配给request.path),如果必须 - 或者更好,将相关信息存储在您的子处理程序可以访问的请求处理程序的属性中。