在App Engine上使用Django处理HTTP HEAD请求的最佳实践

Pau*_*gar 9 django google-app-engine http request head

我在我的应用程序中收到HEAD请求,并想知道处理它们的最佳方法.选项包括:

  • 将它们转换为GET,正常处理GET,然后:
    • 脱掉身体(虽然我不知道怎么样 - response.content = ''似乎没有这样做.
    • 似乎应用程序引擎自动剥离身体,发出警告"丢弃意外的身体以响应HEAD请求"

看起来这很干净,并且可以使用装饰器或中间件很好地编写.

  • 特别处理每个HEAD请求:
    • 这意味着我可以避免在某些(很多?)情况下访问DataStore.
    • 显然,存在一种风险,即通过这种方法将阻止设置Content-length头的中间件.

还要别的吗?我该怎么办?在这里使用App Engine会有所作为吗?有细微的细节; 如果是的话,是否有合适的中间件可供使用?要转换为GET,`request.method ="GET"就足够了(似乎有效)?

Ada*_*and 11

您是否打算让您的应用程序处理HEAD请求,还是来自某些匿名来源?您当然没有义务遵守HEAD请求.您可以使用状态代码405(不允许方法)返回,并提供带有GET的Allow标头或您要处理的任何内容.

我不认为手动设置request.method到GET是有意义的; 很可能,你只是返回一个大于请求者想要的响应.他们只是想看看响应的标题.如果您不想处理HEAD,请执行405和Allow标头方法.

通常,客户端发送HEAD请求,因为他们试图在不需要时不处理完整响应时变得聪明.他们正在检查Content-Length自上次看到响应以来是否已更改,或者他们想要查看Last-Modified或Expires标头.

对于您的应用程序而言,它可以很好地处理HEAD请求,但您不必这样做.

  • *Django 将自动剥离对 HEAD 请求的响应内容,同时保持标头不变,因此您可以像处理视图中的 GET 请求一样处理 HEAD 请求。* 截至修订版 [16115](http://code.djangoproject.com/ changeset/16115) Django 包含方便的 [require_safe](http://docs.djangoproject.com/en/dev/topics/http/decorators/#django.views.decorators.http.require_safe) 装饰器,它限制对 GET 和头。 (2认同)
  • 另请注意, HEAD 请求完全由视图函数处理(甚至 requet.GET 将被填充)。唯一的区别似乎是空的“response.content”。 (2认同)