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

13

我的应用程序收到了HEAD请求,想知道处理它们的最佳方法。以下是几种选择:

  • 将它们转换为GET请求,正常处理GET请求,然后:
    • 删除body(虽然我不确定如何实现 - response.content = '' 似乎无法做到这一点。
    • 似乎应用引擎会自动删除body,并显示警告“在响应HEAD请求中删除意外的body”

这似乎是一种干净、好写且可以使用装饰器或中间件来实现的方式。

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

还有其他什么?我应该怎么做?在这里使用App Engine是否有区别?有微妙的细节吗?如果有,是否有适当的中间件可用?要转换为GET, request.method = "GET"是否足够(看起来可以工作)?

1个回答

15

你的应用是否有意处理HEAD请求,还是来自某些匿名来源?你没有义务满足HEAD请求。你可以返回405状态码(方法不允许)并提供Allow头部,其中包含GET或其他你打算处理的内容。

我认为手动将request.method设置为GET没有意义;很可能你只是返回一个比请求者想要的响应更大的响应。他们只想查看响应的标头。如果你不想处理HEAD,请使用405和Allow头部的方法。

通常,客户端发送HEAD请求是因为他们试图聪明地避免处理完整响应,如果不需要的话。他们正在检查Content-Length是否与上次看到响应时已更改,或者他们想查看Last-Modified或Expires标头。

当然,您的应用程序优雅地处理HEAD请求是合适的,但您不必这样做。


3
Django将自动剥离响应内容以处理HEAD请求,同时保持标头不变,因此您可以在视图中完全像处理GET请求一样处理HEAD请求。从修订版16115开始,Django包含方便的require_safe装饰器,该装饰器限制了对GET和HEAD的请求。 - mike_k
2
还要注意的是,HEAD请求完全由视图函数处理(甚至request.GET也会被填充)。唯一的区别似乎是一个空的response.content - mike_k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接