当Django {%url%}模板标签无法撤消提供的URL时,会引发NoReverseMatch错误。这在开发中非常有用,但在生产中,这会使用户因为丑陋的500错误而停止运行,阻止整个页面,并导致他们认为我们的网站已损坏。
模板开发人员不应该打破整个网站的拼写错误。我想要做的是透明地覆盖这种行为,这样,在生产中,如果找不到反向匹配,它会输出一个默认的URL,如“#”,并将错误报告给后台的异常跟踪系统,但仍然让用户继续他们正在做的事情,而不会引起500错误。
有没有办法透明地用我自己的更安全的版本替换默认的{%url%}标签?我不想在网站上的每个模板的顶部添加{%load my_custom_url_tag%},因为在某些时候人们会忘记,并且标签的行为将是相同的,唯一的区别在于它如何处理错误。
答案 0 :(得分:5)
您可以在静默模式下使用内置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 %}
希望有所帮助。
答案 1 :(得分:0)
通过实施自己的网址标记,您可以解决许多向前兼容性问题。我的建议是添加自定义500错误处理程序:https://docs.djangoproject.com/en/1.4/topics/http/views/#the-500-server-error-view
我认为如果模板开发人员犯了错字,你实际上会希望视图抛出错误。试图掩盖这种行为似乎不合逻辑 - 是不是有足够的理由进行一些简单的单元测试以确保你的观点至少返回200响应代码?