【问题标题】:Google App Engine/Webapp2 redirect for HTTP HEAD requests用于 HTTP HEAD 请求的 Google App Engine/Webapp2 重定向
【发布时间】:2015-01-27 00:38:09
【问题描述】:

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

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

【问题讨论】:

  • 也许这个问题会有所帮助:programmers.stackexchange.com/q/99894
  • 我很感激。然而,我似乎建议我们应该能够发送 301 重定向作为对 HEAD 请求的响应,这正是我想在这里做的。
  • @MarkM,我同意这需要做很多工作——也许现在把它放在适当的位置并向 webapp2 的作者建议扩展,通过编辑该代码比“从外面“就像你做的那样。

标签: python google-app-engine webapp2


【解决方案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 实例化的一部分传递应该是您所需要的。

【讨论】:

  • 谢谢亚历克斯。就像它在您发布的链接中所说的那样:“一系列 HTTP 方法。如果设置,则只有在允许请求方法的情况下,路由才会匹配。”但是,它在文档中没有说,但在源代码中没有设置的是如果未设置会发生什么:“允许的 HTTP 方法的序列。如果未设置,则允许所有方法。”无论哪种方式,设置 methods=['HEAD', 'GET'] 都会产生相同的行为。
  • 附注查看源代码,似乎重定向最终由class RedirectHandler(RequestHandler): 处理。这个类出现了,奇怪的是只实现了一个get() 方法,暗示webapp2 只能重定向HTTP GET 请求。但是,从我的角度来看,很难判断我是否正确。
  • 那么RedirectHandler需要被子类化来实现def head(self, *a, **k): return self.get(*a, **k)。如何说服RedirectRoute 使用您的子类也可能需要依次对其进行子类化。
  • Alex,这似乎奏效了,但这让我觉得我不应该转发 HEAD 请求。请参阅上面的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 2011-10-10
  • 2015-12-25
相关资源
最近更新 更多