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