我正在使用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.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请求现在重定向,但我不确定它是否值得。
答案 0 :(得分:1)
根据https://webapp-improved.appspot.com/api/webapp2_extras/routes.html,RedirectRoute
有一个methods
命名参数(默认为None
),与https://webapp-improved.appspot.com/api/webapp2.html#webapp2.Route.init所有其他路由一样。
作为methods=['head', 'get']
实例化的一部分传递RedirectRoute
应该是您所需要的。