使用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!')
提前致谢!
答案 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消息传递。例如,当他删除或更新条目时,您可以向他显示删除/更新成功消息。