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

Python 针对HTTP头请求的Google App Engine/Webapp2重定向,python,google-app-engine,webapp2,Python,Google App Engine,Webapp2,我使用Google App Engine和webapp2的RedirectRoute方法处理URL,如下所示: app = webapp2.WSGIApplication([ RedirectRoute('/notes/', handler=notes, strict_slash=True, name="notes"), ... ]) 这与预期的一样:对/notes/的请求由我的处理程序处理,对/notes的请求被永久移动到HTTP/1.1 301重定向到/notes

我使用Google App Engine和webapp2的RedirectRoute方法处理URL,如下所示:

app  = webapp2.WSGIApplication([
    RedirectRoute('/notes/', handler=notes, strict_slash=True, name="notes"),
    ...
    ])
这与预期的一样:对
/notes/
的请求由我的处理程序处理,对
/notes
的请求被永久移动到
HTTP/1.1 301
重定向到
/notes/

正是我想要的

但是现在我添加了一个
处理程序。这对于
/notes/
很好,但是
/notes
的HEAD请求得到了
HTTP/1.1405方法,这是不允许的
而不是我所期望的:另一个
301永久移动了
。它既不重定向也不使其到达我的处理程序

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

编辑

根据Alex Martelli下面的想法,这是可行的,但我很惊讶,没有其他方式让我觉得我做错了什么,或者至少是艰难的方式

子类化
webapp2.RedirectHandler
webapp2_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请求现在重定向,但我不确定是否值得这样做。

Per,
RedirectRoute
有一个
methods
命名参数(默认为
None
),就像其他路由一样


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

也许这个问题会有帮助:我很感激。然而,我似乎建议,我们应该能够发送301重定向作为对HEAD请求的响应,这正是我想在这里做的。@MarkM,我同意这是一项大量的工作——也许现在就把它放在适当的位置,并建议对webapp2的作者进行扩展,编辑该代码比“从外部”要容易得多好像你做得对谢谢Alex。正如您发布的链接中所说:“一系列HTTP方法。如果设置了,则只有在允许请求方法的情况下,路由才会匹配。”然而,它在文档中没有说明,但在源代码中却说明了未设置时的情况:“允许的HTTP方法的序列。如果未设置,则允许所有方法。”无论是哪种方式,都可以设置
方法=['HEAD','GET']
导致相同的行为。另外,从源代码看,重定向似乎最终由
类RedirectHandler(RequestHandler)处理:
这个类出现了,奇怪的是,它只实现了
GET()
方法意味着webapp2只能重定向HTTP GET请求。但是,从我的角度来看,很难判断我是否正确。然后需要对
RedirectHandler
进行子类化,以实现
def head(self,*a,**k):返回self.GET(*a,**k)
。如何说服
RedirectRoute
使用您的子类,可能还需要对其进行子类化。Alex,这似乎奏效了,但让我觉得我不应该转发HEAD请求。请参阅上面的编辑。