【问题标题】:Return 405 or 404 for OPTIONS http requestsOPTIONS http 请求返回 405 或 404
【发布时间】:2017-04-19 19:52:58
【问题描述】:

例子:

  • 我们提供网址http://.../foo/download.csv
  • Web 客户端(MS office)打开上面的 URL 并尝试使用 http OPTIONS 请求访问(出于我真的不知道的原因)http://.../foo/
  • 到目前为止或应用程序返回 404,因为上述 URL 不存在(即使对于 GET 请求)。

我认为所有 OPTIONS 请求都应该得到 405。URL 是否可以通过 GET 或 POST 访问应该无关紧要。

这是否符合 http 规范?

这是我为什么认为 405 更适合的解释:如果有 OPTIONS 请求,我不想查看路径。我不在乎路径是什么样子,应该总是有相同的答案:不允许。

到目前为止,这取决于:如果注册了 GET-view,则返回 405。否则返回 404。

更新:404 与 405

HTTP-Spec 405 方法不允许

Request-URI 标识的资源不允许使用Request-Line 中指定的方法。响应必须包含一个 Allow 标头,其中包含所请求资源的有效方法列表。

来源:https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.6

【问题讨论】:

  • 你能提供你的views.pyurls.py,或者至少是它的相关部分吗?
  • 我不认为你关于为什么 405 更适合的论点是正确的。 Method not allowed 表示您正在使用不允许的操作访问现有资源,而 Not found 表示该资源不存在或找不到,无论您如何假装使用它。同样,拥有一个不允许与OPTIONS 一起使用的不存在资源也是不一致的,如果找不到或不存在,为什么不允许OPTIONS 使用它?如果你找不到它,你怎么知道它是不允许的?
  • 我同意 E. 先生的观点 - 首先到 404 是有意义的。允许的方法次要于该位置是否存在资源。你问过 Django/Pythonic 的方式是什么,我相信我的回答给出了最不可接受的版本。最终,您仍然会覆盖一些非常常见且易于理解的行为:如果资源不存在,则返回 404。
  • @Withnail 我更新了问题。问题不再是关于 django/python 了。这是关于http规范的。我仍然不确定。也许你是对的,但另一方面我仍然喜欢简单的“如果 OPTIONS,则返回 405”
  • 嗯,这使它成为一个与您最初提出的问题完全不同的问题。从您引用的 W3 规范中,我给出的答案仍然是有效的。您不能指定在给定 URI 中不存在的资源上允许的方法。

标签: http rfc2616


【解决方案1】:

说实话,还不清楚您为什么希望它返回 405。它永远不会检查方法,因为将首先调用 404 处理程序 - 没有视图逻辑可供它获取,这就是 404 。这是默认的正确行为。

我怀疑,如果您不想为它编写自定义中间件,并且坚持实现它,那么重写 40​​4 处理程序将是前进的方向 - 如果调用 404 处理程序,请检查该方法并返回因此 - 虽然这很混乱,而且自定义中间件会更加 Pythonic。

def handler404(request): 
    if request.method == 'OPTION': 
        #return your custom 405 response
    else: 
        #go on and do your regular 404. 

【讨论】:

    猜你喜欢
    • 2013-01-31
    • 2020-05-02
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多