针对HTTP HEAD请求的Google App Engine / Webapp2重定向

时间:2015-01-27 00:38:10

标签: python google-app-engine webapp2

我正在使用Google App Engine和webapp2的RedirectRoute方法来处理这样的网址:

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

这符合预期:/notes/的请求由我的处理程序处理,/notes的请求获得HTTP/1.1 301 Moved Permanently重定向到/notes/

正是我想要的。

但是现在我添加了一个HEAD处理程序。这适用于/notes/,但/notes的HEAD请求正在获得HTTP/1.1 405 Method Not Allowed而不是我期望的:另一个301 Moved Permanently。它既没有重定向也没有成为我的处理程序。

我错过了什么?这是预期的行为吗?我该如何重定向HEAD请求?

修改

根据Alex Martelli的想法,这可行,但我感到非常惊讶,以至于我觉得我做错了或者至少是艰辛的道路。

webapp2.RedirectHandlerwebapp2_extras.routes.RedirectRoute进行子类化工作:

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请求现在重定向,但我不确定它是否值得。

1 个答案:

答案 0 :(得分:1)

根据https://webapp-improved.appspot.com/api/webapp2_extras/routes.htmlRedirectRoute有一个methods命名参数(默认为None),与https://webapp-improved.appspot.com/api/webapp2.html#webapp2.Route.init所有其他路由一样。

作为methods=['head', 'get']实例化的一部分传递RedirectRoute应该是您所需要的。