2013-02-21 57 views
1

Django {%url%} templatetag无法反转提供的URL时引发NoReverseMatch错误。这在开发中非常有用,但是在制作过程中,这会使用户停下脚步,导致500页错误,阻止整个页面,并导致他们认为我们的网站已损坏。使django url标记无提示失败

模板开发人员不应该能够打印整个网站的错字。我想要做的就是透明地覆盖这种行为,这样仅在生产环境中,如果找不到反向匹配,它会输出一个默认url,如“#”,并将错误报告给我们的后台异常跟踪系统,但仍然可以让用户在不增加500错误的情况下继续做他们正在做的事情。

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

回答

1

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

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

+0

我们已经有一个自定义的500错误页面,向我们报告NoReverseMatch错误。它将以任何方式进行跟踪。我不希望发生的事情是让用户被阻止,无论他们试图做什么,并抱怨说整个网站已关闭,仅仅是因为某个编辑器在一段副本中放了一个错误的{%url%}标记。我希望它是一样无足轻重,就好像有人在页面中放入了一个破损的标签。 – LS55321 2013-02-21 14:30:11

+0

我不明白的是为什么你会让代码没有投入生产。 – Brandon 2013-02-21 14:31:13

+0

通过该逻辑,任何复制中存在拼写错误的页面也应该引发500错误。 – LS55321 2013-02-21 14:37:01

4

您可以在静默模式下使用内置的url标记,尝试查找,然后使用找到的内容为—的URL。

Django docs

如果视图中缺少这{% url ... as var %}语法不会导致错误。在实践中,你会使用这个链接到的意见是可选:

​​

希望有所帮助。

+0

太糟糕了,重写是不可能的,因为解决你的问题的代码很长! – benzkji 2017-09-11 09:07:10