【问题标题】:Best practice for handling HTTP HEAD request with Django on App Engine在 App Engine 上使用 Django 处理 HTTP HEAD 请求的最佳实践
【发布时间】:2010-12-30 23:32:07
【问题描述】:

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

  • 将它们转换为 GET,正常处理 GET,然后:
    • 剥离身体(虽然我不确定如何 - response.content = '' 似乎没有这样做。
    • 似乎应用引擎会自动剥离正文,并发出警告“丢弃意外正文以响应 HEAD 请求”

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

  • 专门处理每个 HEAD 请求:
    • 这意味着我可以避免在某些(很多?)情况下访问 DataStore。
    • 显然,这种方法会阻止设置 Content-length 标头的中间件这样做。

还有什么?我应该做什么?在这里使用 App Engine 有什么不同吗?是否有微妙的细节;如果是这样,是否有合适的中间件可以使用?要转换为 GET,`request.method = "GET" 是否足够(似乎可行)?

【问题讨论】:

    标签: django http google-app-engine request head


    【解决方案1】:

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

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

    通常,客户端会发送 HEAD 请求,因为他们会尽量避免在不需要时不处理完整响应。他们正在检查自上次看到响应以来 Content-Length 是否发生了变化,或者他们想查看 Last-Modified 或 Expires 标头。

    对于您的应用程序来说,优雅地处理 HEAD 请求当然是表现良好的,但您不必这样做。

    【讨论】:

    • Django 将自动剥离对 HEAD 请求的响应内容,同时保持标头不变,因此您可以像处理视图中的 GET 请求一样处理 HEAD 请求。 截至修订版@ 987654321@ Django 包含方便的require_safe 装饰器,它将请求限制为 GET 和 HEAD。
    • 另请注意,HEAD 请求完全由视图函数处理(甚至 requet.GET 也会被填充)。唯一的区别似乎是空的response.content
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    相关资源
    最近更新 更多