2012-05-22 55 views
0

在我的GAE應用程序中,我使用webapp2.RequestHandler.initialize對請求做了自定義內容。
直到幾天前,更改os.environ['PATH_INFO']確實會影響在RequestHandler上調用self.request.path,並且它反映了已更改的請求路徑。 (並且這仍然可以在SDK上正常工作)webapp2,self.request.path更改GAE上的問題

現在它不再起作用了。當然因爲它有很多問題。 我明白這可能是一個邊緣案例,但是這個變化的原因是什麼?

受影響的代碼:

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 
+0

你爲什麼改變路徑而不向頭添加新實體? –

+0

我明白了,但我想盡可能地保持默認實現,以便能夠使用所有self.request道具和功能。但我當然知道如何解決這個問題。仍然不明白過去幾天發生了什麼變化。 – aschmid00

回答

1

os.environ包含CGI風格的環境變量。像webapp(2)這樣的WSGI應用程序可以從那裏(或不是,取決於容器)獲取他們的信息,但是他們歡迎 - 甚至可能 - 複製,而不是引用原始數據。沒有理由假定操縱os.environ會影響你的WSGI應用程序,這樣做有幾個原因是一個壞主意:

  1. 它打破了抽象
  2. 它可能不是線程安全的
  3. 這只是討厭

而是直接修改請求對象(例如,通過分配給request.path),如果你一定要 - 或者更好,存儲在請求處理塔中的屬性的相關信息您的子處理程序可以訪問。

+0

你的權利。我試圖直接修改request.path,但這當然不起作用。改變request.environ會做詭計。 – aschmid00

+0

@ aschmid00真的嗎?修改請求對象_should_適用於大多數屬性。當你嘗試時發生了什麼? –

+0

我得到一個'AttributeError:can not set attribute',因爲在'webob.Request'中,我訪問的大多數屬性都是'@ property's request.environ構造的。雖然直接設置request.path不起作用,但設置'request.PATH_INFO','request.path_info'或'request.environ.PATH_INFO'確實按預期工作。 – aschmid00