Python 针对HTTP头请求的Google App Engine/Webapp2重定向
我使用Google App Engine和webapp2的RedirectRoute方法处理URL,如下所示: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
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请求。请参阅上面的编辑。