何时在django中使用消息或404

时间:2014-10-27 10:43:08

标签: django http-status-code-404 django-messages

使用django.contrib.messages或显示404页面时我有疑问。在哪种情况下,我应该使用一个还是另一个?

serial = get_object_or_404(SerialNumber, serial_number=sn)

try:
    serial = SerialNumber.objects.get(serial_number=sn)
except SerialNumber.DoesNotExist
    messages.add_message(request, messages.WARNING, 'no found!')

提前致谢!

3 个答案:

答案 0 :(得分:2)

让我们说你有这样的网址:

/article/<pk>/

如果最终用户呼叫/article/5/并且没有ID为5的文章,那么您不仅应该返回一条消息,找不到搜索到的术语,还应该返回正确的HTTP状态代码,即404.在这里你应该使用get_object_or_404

如果您想在/article/4/的页面上显示一些其他信息,并且有一篇ID为4的文章,但这个特定的附加信息不存在,那么您应该显示ID为4的文章的页面,返回HTTP状态代码200,表示正常,并显示消息,表明附加信息不可用。

主要区别在于我对HTTP状态代码的正确处理,但如果我错了,我会让别人教我。

答案 1 :(得分:1)

在我看来,404错误和Django消息框架之间的主要区别在于404与服务器相关,消息与您的应用程序相关。

换句话说,如果用户需要一个不存在的url(即/ url / which / doesnt / exists /),那么服务器应该发送404.但是如果用户需要你的应用程序的一个功能,那么失败或者提供信息或调试消息(/ articles / feature_acting_on_article_db /),那么你应该使用消息框架。

正如您在文档https://docs.djangoproject.com/en/1.7/ref/contrib/messages/中看到的那样,消息在应用程序级别使用。 404错误的定义由:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5

给出
  

(...)当服务器不希望明确拒绝请求的原因或没有其他适用的响应时,通常会使用此状态代码。

总而言之,我会说处理像/ article / 5 /这样没有第5篇文章的网址的正确方法是发送消息,因为/ article / pk /是< em>选择并显示第pk条的信息的功能(并且没有文章并不意味着命令失败),即使用户输入了网址(但是&#39;我对这个问题的看法。)

答案 2 :(得分:1)

当用户尝试访问服务器上不可用的任何资源时,应显示404页面页面。 另一方面,当您希望让用户看到与应用程序相关的自定义消息时,会使用django消息传递。例如,当他删除或更新条目时,您可以向他显示删除/更新成功消息。