【问题标题】:When to use messages or 404 in django何时在 django 中使用消息或 404
【发布时间】:2014-10-27 10:43:07
【问题描述】:

我在使用 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!')

提前致谢!

【问题讨论】:

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


    【解决方案1】:

    假设你有一些这样的网址:

    /article/<pk>/
    

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

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

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

    【讨论】:

    • 通常404更严重,比如“嘿,你要访问的对象不存在,这是错误的!”但是使用消息框架,您可以在任何页面的一部分显示不太严重的消息。
    【解决方案2】:

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

    换句话说,如果用户需要一个不存在的 url(即 /url/which/doesnt/exist/),那么服务器应该发送 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 篇文章的 URL 的正确方法是发送消息,因为 /article/pk/ 是 一个选择并显示第 pk 文章信息的功能(没有文章并不意味着命令失败),即使用户输入了一个 url(但这是我对这个问题的看法)。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-14
        • 2017-12-13
        • 1970-01-01
        • 2011-09-05
        • 2016-05-28
        • 1970-01-01
        • 2019-07-26
        • 2021-10-26
        相关资源
        最近更新 更多