为什么Django没有使用默认的404视图传递错误消息?

时间:2011-10-16 11:31:35

标签: django

(上下文:我对Django和Web开发都很新。)

1)有人可以解释以下声明的推理吗? This Q/A回答了 如何处理它的问题,但不是为什么它可能是好/坏主意。

The docs状态,“page_not_found视图应该 足以满足99%的Web应用程序,但如果要覆盖它, 你可以在你的URLconf“。

中指定handler404

也就是说,page_not_found视图仅传递请求的URL并忽略 提出异常时提供的任何消息。在我看来,这 使用选项为404.html模板提供有用的提示 默认情况下对每个人都有好处。

2)我正在制作自定义视图,以便我可以针对以下情况传递有用的消息。我不应该有某种原因吗?

我正在使用矩阵网址,因此基本资源是 一个普通的分层URL,后跟基本的矩阵选项 格式: ; filter_type1 = item:value,item:value; filter_type2 = item:value ...

因此,根据距离提供有用的消息非常容易 在发生错误之前进行解析。通过似乎对我有帮助 在如下消息上:

  • “允许的filter_types为:type1,type2,type3。”或
  • “filter_type a的允许项目为:item1,item2,item3。”

如果我在其他地方错过了这个解释,请道歉。我看了,我asked on google django-users但没有回复。

3 个答案:

答案 0 :(得分:1)

我不确定问题是什么。默认情况下,page_not_found视图是基本的,因为没有那么多情况需要解释为什么找不到页面,除非它没有找到。

我假设'矩阵选项'是指URL / GET参数,如:

http://domain.com/page/?option1=value&option2=value..

如果输入错误的参数组合而不是抛出404,为什么不默认为基本网址/模板(http://domain.com/page/),并显示错误消息“Option1只能是x, Y,Z”。通过这种方式,它们会显示一个熟悉的页面,并且可以重新选择它们而无需从404页面导航回来(并且它不会因为它不起作用而令人困惑)。

您可以使用django的messaging framework轻松完成此操作(我过去已经这样做过)。在检查视图中的参数时,将错误消息传递给模板。

答案 1 :(得分:1)

如果您的数据如下:

http://example.com/foo;bar;baz

然后你做错了:)

然后,您需要使用正则表达式来解析要处理的数据。

  

有些人在遇到问题时会想“我知道,我会用   正则表达式。“现在他们有两个问题。

(Zawinski,1997)

相反,正如pastylegs所建议的那样,使用GET参数。

更好的是,使用django表单处理和:

  • 创建一个具有验证规则的表单
  • 从该表单呈现输入页面
  • 使用表单
  • 解析用户输入
  • 如果表单有效则显示数据,否则显示验证错误以及用户输入

您可以使用GET请求或POST请求执行此操作。 POST具有“干净”网址和更长数据体的优势。 GET意味着可以为网址添加书签。

这一切归结为使用框架的正确部分来完成正确的任务。 URL路由使用正则表达式来计算哪些URL命中哪些视图。您制作网址模式越简单,维护起来就越容易。用户输入应由表格处理。

答案 2 :(得分:1)

我认为你理解这个问题的原因是,你试图混合两个不同的问题。

首先,是否找到实际页面的问题 其次,问题是所提供的参数是否有效。

所以,如果(部分)网址是:

    .../whatever/?param1=value1&param2=value2

如果页面/whatever/default 未找到,您将(应该)显示"404 Page not found"类型的错误消息。在这种情况下,你不能告诉所提供的参数或值是否正确。请求的页面不存在,因此您不知道参数所针对的页面。你甚至不能假设指定了正确的domain name。可能存在许多参数有效的任意域,URL和页面,以及参数无效的许多其他域,URL和页面。

如果找到/whatever/default 页面,则:
如果指定错误的参数可能导致该页面加载/重定向不存在的页面,那么该页面应该阻止该页面。如有必要,应该由该页面来验证所提供的参数,并采取适当的措施并显示相应的消息。