我正在开发一个django应用程序,随着时间的推移,URL已经增长。我现在和他有很多关系,由于我做了一些改变,一个视图开始出现故障。当我尝试获取http://example.com/foo/edit_profile时,它应该执行视图某个视图函数X
,但它正在执行Y
。在某个地方,网址路由混乱,我无法弄清楚。我使用django.core.urlresolvers.resolve
方法从shell中尝试它,我可以确认URL被错误地解决了。但是,我不知道如何调试它并查明问题。
理想情况下,我希望看到类似“测试此模式”,“测试此模式”等等,直到最终找到正确的模式,然后我可以环顾四周解决的问题。我找不到这样的东西。
这不是大型项目的常见问题吗?人们做什么?
更新
我知道系统如何工作以及如何逐个浏览网址。这就是我想要做的。这个问题基本上是要求捷径。
答案 0 :(得分:29)
答案 1 :(得分:4)
我会在您的url.py中注释掉这些模式,直到您尝试导航到foo
时出现404错误。如果那个模式是一个包含,我会把它递减出来并注释掉那个url.py中的行。最终你会确切地知道哪个模式匹配。
然后我将采取它正在调用的视图函数和硬编码。如果它使用通用视图或微妙的东西,我会尽可能明显和直接。此时,您应该知道哪个规则匹配,以及它在视图中执行的原因和代码。
答案 2 :(得分:1)
你可以假设,它从上到下遍历urlpatterns,匹配的第一个将被执行。
如您所知,执行哪个视图(Y
)请考虑:
Y
在X
之前:Y的模式与网址匹配(但不应该)X
在Y
之前:X的模式与网址不匹配(但应该)您能提供一些更明确的URLConf示例吗?我可以给你一个更明确的答案。
答案 3 :(得分:0)
查看你的urlconf,找到哪个urlpattern调用你的视图Y,看看regexp是否比它应该更普遍。尝试注释掉导致错误匹配的urlpattern,看看它是否与X匹配。
通常情况下,这对我来说不是问题,但确实会发生。在一般模式之前始终保持更具体的模式。使用静态前缀来划分url名称空间,以防止错误匹配。