2010-09-01 32 views
21

我正在开发一个django应用程序,随着时间的推移,URLs已经增长。我现在有很多人和我在一起,由于我做了一些改变,一种观点开始出现故障。当我尝试GET http://example.com/foo/edit_profile时,它应该执行一个视图某个查看功能X,但它正在执行Y。网址路由被搞乱了,我无法弄清楚。我使用django.core.urlresolvers.resolve方法从shell中尝试它,并且我可以确认该URL得到错误解决。但是,我不知道如何调试并找出问题所在。Django的url调试器

理想情况下,我希望看到像“测试此模式”,“测试此模式”等等,直到它最终找到正确的一个,然后我可以查看它解决的位置。我找不到像这样的东西。

这不是大项目的常见问题吗?人们做什么?

更新

我知道系统是如何工作的,以及如何通过网址逐一看看。这就是我想要做的。这个问题基本上是要求一个捷径。

+0

我还没有看到一组这样复杂的URL。我的'urls.py'往往有一堆包含,其中每一个都有它自己的唯一前缀(例如'^ foo'将在'foo'应用中包含URL,所以我可以去那里找出下一场比赛的位置如果你遇到这个问题,你的'urls.py'可能太复杂了,如果你发布它,我们可能会帮你弄清楚什么是错误的... – 2010-09-01 08:48:52

+1

其实,我的(和其他所有的我(已见过)都是“名称空间”(一个唯一的前缀后跟一个包含),但由于某种原因,我的一个foo/URL被路由到了酒吧/应用程序并从那里返回了一些东西。一个调试器只是告诉我按照什么样的顺序进行分辨率的尝试,以便我能够明确问题 – 2010-09-01 09:07:42

回答

26

你已经尝试安装django_extensions后运行

manage.py show_urls 

http://vimeo.com/1720508 - 从06:58观看。

这应该给你以什么顺序的url解析尝试。

希望这可以帮助

+0

有趣...我没有意识到这一点。谢谢! – 2010-12-30 09:26:45

+1

好主意。在尝试使用它之前,不要忘记您需要将django_extensions添加到installed_apps中https://django-extensions.readthedocs.org/en/latest/installation_instructions.html – glaucon 2015-02-01 08:41:44

0

看看你的urlconfs,找到哪个urlpattern调用你的视图Y,看看这个正则表达式是否比它应该更普遍。尝试注释掉导致错误匹配的urlpattern,看它是否正确匹配X.

通常,这对我来说不是问题,但它确实发生。始终在一般模式之前保留更具体的模式。使用静态前缀来划分你的url命名空间,以防止错误匹配。

+0

由于我现在有大量的URL和正则表达式,所以这个过程非常耗时,这是我现在正在做的,我喜欢有一个体面的“URL调试器”,而不是整个评论和评论各种url文件。 – 2010-09-01 07:59:06

0

你可以假设它从上到下经历了urlpatterns,第一个匹配的将被执行。

正如你知道哪个是执行视图(Y)想一想:

  • 如果YX前:Y的模式的URL匹配(但是不应该)
  • 如果X是前Y:X的模式与url不匹配(但应该)

您能提供一些更明确的URLConf示例吗?比我能给你一个更明确的答案。

+0

他们很典型。类似Dominic所说的。我知道他们是如何工作的,你的两点都很好。只是在尝试获取修复程序时手动执行此操作非常繁琐,这就是我寻找调试器的原因。 – 2010-09-01 10:33:16

+0

如果您真的认为它对您有帮助,您可以随时在django源文件中添加一些打印行。它只会告诉你,它完全从上到下,并试图匹配每个正则表达式直到它匹配。可能在这里:http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L143 – 2010-09-01 11:03:58

+0

这就是我正在做的。 :) – 2010-09-01 19:40:08

3

我会将url.py中的模式注释掉,直到您尝试导航到foo时出现404错误。如果这种模式是一个包含,我会缓解,并注释掉url.py中的行。最终你会确切知道哪种模式匹配。

然后,我会把它正在调用的视图函数和硬编码。如果它使用的是通用视图或者其他细微的东西,我会尽可能地明确和直接。此时,您应该知道哪些规则匹配,以及它在视图中执行的原因和代码。

+0

嗯。是啊。它会有点慢,但可行。 – 2010-10-21 03:58:08

+0

好的,这个怎么样:注释掉所有*你的顶级url模式,并且在你用404确认之后,重新启用你认为正在使用的模式。如果你错了,你会学到一些东西。如果你是对的,深入研究,包括(假设它是一个包含)并且注释掉除了你认为正在使用的所有内容。有了这个快捷方式,它应该花费你五到十分钟的时间来确定你想使用的代码是否被使用。 – hughdbrown 2010-10-21 04:17:31