2009-12-30 29 views
8

我在应用程序中收到HEAD请求,并想知道如何处理它们。选项包括:在App Engine上使用Django处理HTTP HEAD请求的最佳实践

  • 将它们转换为入眼,过程通常的方式,那么:
    • 剥离体(虽然我不知道如何 - 似乎response.content = ''不这样做
    • 它似乎应用发动机自动去掉身体,给予警告

看来这是干净的“响应HEAD请求删除意外的身体”,并能很好地我们写装饰器或中间件。

  • 处理每个HEAD请求专门:
    • 这意味着我能避免一些(很多?)情况下的数据存储访问。
    • 显然,设置内容长度标题的中间件将会被这种方法阻止。

还有什么?我该怎么办?在这里使用App Engine会有所作为吗?有细微的细节;如果是这样,是否有适当的中间件使用?要转换为GET,是`request.method =“GET”足够(它似乎工作)?

回答

10

您是否打算为您处理HEAD请求的应用程序,还是来自某些匿名源?您当然没有义务履行HEAD请求。您只需返回状态码405(方法不允许),并提供允许标头GET或任何意思处理。

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

通常,客户端发送HEAD请求是因为他们试图在不需要处理完整响应时聪明起来。他们正在检查自上次看到响应后内容长度是否发生了变化,或者他们希望看到Last-Modified或Expires标题。

对于您的应用程序来说,优雅地处理HEAD请求肯定是行之有效的,但您不必这样做。

+1

* 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和HEAD。 – 2011-05-22 17:37:40

+1

另请注意,HEAD请求已完全由视图函数处理(甚至requet.GET将被填充)。唯一的区别似乎是空的'response.content'。 – 2011-05-22 18:18:14