2012-05-22 2 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. 그것은 나누기 추상화

    대신에 당신이해야하는 경우 (예를 들어, request.path에 할당하여) 직접 요청 개체를 수정 - 또는 더 나은, 요청 처리기 그쪽에 속성의 관련 정보를 저장 하위 처리자가 액세스 할 수 있습니다.

  • +0

    오른쪽. request.path를 직접 수정하려했지만 물론 작동하지 않았습니다. request.environ이 트릭을 변경합니다. – aschmid00

    +0

    @ aschmid00 정말요? 대부분의 특성에 대해 요청 오브젝트를 수정 _ _해야합니다. 네가 시도했을 때 무슨 일이 있었 니? –

    +0

    'weblog.Request'에서 접근하는 대부분의 속성이 request.environ에서 생성 된'@ property's이기 때문에'AttributeError : attribute를 설정할 수 없습니다 '라는 메시지가 나타납니다. request.path를 직접 설정하지 않으면'request.PATH_INFO','request.path_info' 또는'request.environ.PATH_INFO'가 예상대로 작동합니다. – aschmid00