2015-01-27 6 views
0

을 요청구글 앱 엔진 HTTP의 HEAD에 대한 리디렉션/Webapp2 내가이 같은 URL을 처리하는 구글 앱 엔진과 webapp2의 RedirectRoute 방법을 사용하고

app = webapp2.WSGIApplication([ 
    RedirectRoute('/notes/', handler=notes, strict_slash=True, name="notes"), 
    ... 
    ]) 

이 예상대로 작동합니다 /notes/에 대한 요청 내 핸들러에 의해 처리됩니다 /notes에 대한 요청은 /notes/으로 리디렉션되는 HTTP/1.1 301 Moved Permanently이됩니다.

정확히 내가 원하는 것.

하지만 이제는 HEAD 처리기를 추가했습니다. /notes/에 대해서는 정상적으로 작동하지만 /notes에 대한 HEAD 요청은 내가 예상했던 것보다 HTTP/1.1 405 Method Not Allowed이됩니다. 또 다른 301 Moved Permanently입니다. 그것은 리디렉션도 아니고 내 처리기로도 연결되지 않습니다.

무엇이 누락 되었습니까? 이 예상되는 동작입니까? HEAD 요청을 어떻게 리디렉션해야합니까?

아래 알렉스 마르 텔리의 아이디어를 바탕으로 편집

이 작동하지만, 나는 내가 잘못 또는 적어도 어려운 방법 일을하고 있어요 같은 느낌 또 다른 방법이 아니다 너무 놀랐어요.

import webapp2 
from webapp2_extras.routes import RedirectRoute 

class myRedirectHandler(webapp2.RedirectHandler): 
    def head(self, *args, **kwargs): 
     return self.get(*args, **kwargs) 

class myRedirectRoute(RedirectRoute): 
    def _get_redirect_route(self, template=None, name=None): 
     template = template or self.template 
     name = name or self.name 
     defaults = self.defaults.copy() 
     defaults.update({ 
      '_uri': self._redirect, 
      '_name': name, 
      }) 
     new_route = webapp2.Route(template, myRedirectHandler, 
        defaults=defaults) 
     return new_route 

HEAD 요청 지금 리디렉션하지만 그만한 가치가 있을지 확실하지 않다 :

모두 webapp2.RedirectHandlerwebapp2_extras.routes.RedirectRoute 작품을 하위 클래스.

+0

아마도이 질문은 도움이 될 것입니다. http://programmers.stackexchange.com/q/99894 – mgilson

+0

감사합니다. 그러나 우리가 HEAD 요청에 대한 응답으로 301 리디렉션을 보낼 수 있어야한다고 제안하는 것으로 보입니다. 이것이 내가 여기서하고 싶은 것입니다. –

+0

@MarkM, 나는 그것이 많은 일에 동의한다 - 어쩌면 지금 그 자리에 놓고 webapp2의 저자에게 연장을 제안하면, 너는 "외부에서"보다는 그 코드를 편집하는 것이 훨씬 쉽다. 제대로하고있어. –

답변

1

https://webapp-improved.appspot.com/api/webapp2_extras/routes.html 당, RedirectRoutehttps://webapp-improved.appspot.com/api/webapp2.html#webapp2.Route.init에 따라 다른 모든 경로 같은 methods라는 이름의 인수 (None 기본값)가 있습니다.

RedirectRoute의 인스턴스 화의 일환으로 methods=['head', 'get']을 전달하면 사용자가 필요한 것입니다.

+0

알렉스에게 감사드립니다. 링크에 다음과 같이 게시했습니다. "일련의 HTTP 메소드. 설정된 경우 요청 메소드가 허용되는 경우에만 경로가 일치합니다." 그러나 docs에서 말하지 않지만 소스에서 설정되지 않은 경우는 "허용 된 HTTP 메소드 순서입니다. 설정하지 않으면 모든 메소드가 허용됩니다." 어느 쪽이든,'methods = [ 'HEAD', 'GET']'설정은 똑같은 행동을합니다. –

+0

p.s. 리디렉션 '클래스 RedirectHandler (RequestHandler를) 처리 치울 것처럼 보인다 소스를 통해 상대 :' 이 클래스는 webapp2는 HTTP GET 요청을 리디렉션 할 수 있음을 의미'수()'메소드를 구현 이상하게에 나타납니다. 그러나, 나의 유리한 관점에서, 이것이 내가 옳은지를 말하기는 어렵습니다. –

+0

그러면'RedirectHandler'는'def head (self, * a, ** k) : return self.get (* a, ** k)'를 구현하기 위해 서브 클래스 화되어야합니다. 'RedirectRoute'가 서브 클래스를 사용하도록 설득하는 방법은 서브 클래스를 차례로 요구할 수도 있습니다. –