使 django url 标签静默失败

Posted

技术标签:

【中文标题】使 django url 标签静默失败【英文标题】:Make django url tag fail silently 【发布时间】:2013-02-06 21:55:40 【问题描述】:

当 Django % url % 模板标签无法反转提供的 URL 时,它会引发 NoReverseMatch 错误。这在开发中很有用,但在生产中,这会阻止用户陷入难看的 500 错误,阻止整个页面,并导致他们认为我们的网站已损坏。

模板开发人员不应该因为拼写错误而导致整个网站瘫痪。我想要做的是透明地覆盖此行为,以便仅在生产中,如果找不到反向匹配,它会输出一个默认 url,如“#”,并在后台向我们的异常跟踪系统报告错误,但仍然允许用户继续他们正在做的事情而不会引发 500 错误。

有没有办法透明地用我自己的更安全的版本替换默认的 % url % 标记?我不想在网站上每个模板的顶部添加 % load my_custom_url_tag %,因为在某些时候人们会忘记,否则标签的行为将是相同的,唯一的区别在于它如何处理错误。

【问题讨论】:

【参考方案1】:

您可以在静默模式下使用内置的 url 标记,尝试查找,然后使用它找到的 URL——如果它找到了什么。

来自Django docs:

如果视图丢失,此% url ... as var % 语法不会导致错误。在实践中,您将使用它来链接到可选视图:

% url 'path.to.view' as the_url %
% if the_url %
   <a href=" the_url ">Link to optional stuff</a>
% endif %

希望对您有所帮助。

【讨论】:

太糟糕的覆盖是不可能的,因为解决您问题的代码很长!【参考方案2】:

通过实现您自己的 url 标签,您将面临许多前向兼容性问题。我的建议是添加自定义 500 错误处理程序:https://docs.djangoproject.com/en/1.4/topics/http/views/#the-500-server-error-view

我认为如果模板开发人员打错字,您实际上会希望视图抛出错误。试图掩盖这种行为似乎不合逻辑 - 这还不足以进行一些简单的单元测试以确保您的视图至少返回 200 响应代码吗?

【讨论】:

我们已经有一个自定义的 500 错误页面向我们报告 NoReverseMatch 错误。无论哪种方式,它都会被跟踪。我不希望发生的事情是让用户被阻止他们尝试做的任何事情并抱怨整个网站已关闭,只是因为某些编辑器在一段副本中放置了错误的 % url % 标记。我希望它就像有人在页面中放入损坏的 标记一样无关紧要。 我不明白的是为什么你会让那些没有运行到生产环境的代码。 按照这个逻辑,任何在副本中有拼写错误的页面也应该抛出 500 错误。 错了。 % url % 是一个 Django 模板标签,而不是纯文本。如果您允许在输入字段中使用标签,然后希望对它们进行评估,那么您需要验证输入以确保格式正确。在允许 % url % 标签的情况下,您必须将标签解析出来,对其调用 reverse 并查看它是否不会爆炸。 您从哪里得知输入字段中有标签?

以上是关于使 django url 标签静默失败的主要内容,如果未能解决你的问题,请参考以下文章

从 AWS Lambda 获取 URL 时出现静默错误

为啥 $.getJSON 静默失败?

运行 CRON 时,'require' 静默失败

ReactJS - 使用 iframe 静默更新令牌

DiscordJS Canvas 静默失败。为啥?

Python SQLAlchemy+Threading 静默失败