2

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

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

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

4

2 回答 2

5

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

来自Django 文档

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

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

希望有帮助。

于 2013-02-22T13:10:13.603 回答
0

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

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

于 2013-02-21T14:25:42.223 回答