【问题标题】:Django url debuggerDjango url 调试器
【发布时间】:2011-04-06 15:33:34
【问题描述】:

我正在开发一个 django 应用程序,随着时间的推移,URL 越来越多。我现在有很多,由于我做了一些改变,一个视图开始出现故障。当我尝试获取http://example.com/foo/edit_profile 时,它应该执行某个视图函数X,但它正在执行Y。某个地方的 url 路由搞砸了,我想不通。我使用django.core.urlresolvers.resolve 方法从shell 尝试它,我可以确认URL 得到错误解析。但是,我不知道如何调试它并查明问题。

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

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

更新

我知道系统是如何工作的,以及如何一一浏览网址。这就是我想要做的。这个问题基本上是在问捷径。

【问题讨论】:

  • 我还没有看到这么复杂的一组 URL。我的urls.py 往往有一堆包含,每个都有自己独特的前缀(例如,^foo 会在 'foo' 应用程序中包含 URL,所以我可以去那里找出下一个匹配来自哪里. 如果您遇到此问题,您的urls.py 可能太复杂了。如果您发布它,我们或许可以帮助您找出问题所在...
  • 实际上,我的(以及我见过的所有其他人)都是“命名空间”(一个唯一的前缀后跟一个包含)。但由于某种原因,我的 foo/ URL 之一被路由到 bar/ 应用程序并从那里返回一些东西。最好有一个调试器来告诉我尝试解决的顺序是什么,以便我可以查明问题。

标签: django debugging django-urls


【解决方案1】:

你是否已经尝试过运行

manage.py show_urls

安装django_extensions之后?

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

这应该会告诉您尝试 url 解析的顺序。

希望对你有帮助

【讨论】:

【解决方案2】:

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

然后我会采用它正在调用的视图函数并对其进行硬编码。如果它使用通用视图或一些微妙的东西,我会使其尽可能明显和直接。此时,您应该知道匹配哪个规则以及它在视图中执行的原因和代码。

【讨论】:

  • 好的,怎么样:注释掉all你的顶级url模式,在你用404确认后,重新启用你认为正在使用的一种模式。如果你错了,你会学到一些东西。如果您是对的,请深入研究该包含(假设它是一个包含)并注释掉除您认为正在使用的内容之外的所有内容。使用此快捷方式,您应该需要五到十分钟才能确定您要使用的代码是否正在被使用。
【解决方案3】:

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

您知道哪个视图被执行 (Y) 考虑一下:

  • 如果 YX 之前:Y 的模式与 url 匹配(但不应该)
  • 如果XY 之前:X 的模式与网址不匹配(但应该)

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

【讨论】:

  • 他们很典型。类似于多米尼克所说的。我知道它们是如何工作的,你的两点很好。只是在尝试修复时手动完成这件事很乏味,这就是我寻找调试器的原因。
  • 如果您真的认为它对您有帮助,您可以随时在 django 源代码中添加一些打印行。它只会向您展示它完全从上到下并尝试匹配每个正则表达式,直到它匹配为止。也许在这里:code.djangoproject.com/browser/django/trunk/django/core/…
【解决方案4】:

查看您的 urlconfs,找出哪个 urlpattern 调用您的视图 Y,并查看正则表达式是否比应有的更通用。尝试注释掉导致错误匹配的urlpattern,看看它是否正确匹配X。

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

【讨论】:

  • 这对于我目前拥有的大量 URL 和正则表达式来说非常耗时。这就是我现在正在做的事情,但我想要一个像样的“URL 调试器”,而不是从各种 url 文件中逐行注释和注释的整个业务。
猜你喜欢
  • 2013-06-20
  • 2020-12-13
  • 2018-11-16
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 2011-08-09
相关资源
最近更新 更多