确定完整的Django urlconfiguration

有没有办法获得完整的 Django的urlconfiguration?

例如,Django的debugging404页面不显示包含的URLconfiguration,所以这不是完整的configuration。


:感谢Alasdair,这是一个脚本示例:

import urls def show_urls(urllist, depth=0): for entry in urllist: print " " * depth, entry.regex.pattern if hasattr(entry, 'url_patterns'): show_urls(entry.url_patterns, depth + 1) show_urls(urls.urlpatterns) 

Django是Python,所以内省是你的朋友。

在shell中,导入urls 。 通过循环遍历urls.urlpatterns ,并尽可能多的层层包含urlconfiguration,你可以构build完整的urlconfiguration。

 import urls urls.urlpatterns 

列表urls.urlpatterns包含RegexURLPatternRegexURLResolver对象。

对于RegexURLPattern对象p ,可以用正则expression式显示

 p.regex.pattern 

对于表示包含的urlconfiguration的RegexURLResolver对象q ,可以显示正则expression式的第一部分

 q.regex.pattern 

然后使用

 q.url_patterns 

这将返回RegexURLResolverRegexURLPattern对象的更多列表。

Django扩展提供了一个实用程序来执行此操作作为manage.py命令。

 pip install django-extensions 

然后将django_extensions添加到django_extensions中的INSTALLED_APPS。 然后从控制台input以下内容

 python manage.py show_urls 

在添加“我也是”答案的风险中,我发布了上述提交的脚本的修改版本,该脚本给出了一个视图,列出项目中的所有URL,按照字母顺序进行了一些修饰和sorting,以及他们所调用的视图。 更多的是开发者工具而不是生产页面。

 def all_urls_view(request): from your_site.urls import urlpatterns #this import should be inside the function to avoid an import loop nice_urls = get_urls(urlpatterns) #build the list of urls recursively and then sort it alphabetically return render(request, "yourapp/links.html", {"links":nice_urls}) def get_urls(raw_urls, nice_urls=[], urlbase=''): '''Recursively builds a list of all the urls in the current project and the name of their associated view''' from operator import itemgetter for entry in raw_urls: fullurl = (urlbase + entry.regex.pattern).replace('^','') if entry.callback: #if it points to a view viewname = entry.callback.func_name nice_urls.append({"pattern": fullurl, "location": viewname}) else: #if it points to another urlconf, recur! get_urls(entry.url_patterns, nice_urls, fullurl) nice_urls = sorted(nice_urls, key=itemgetter('pattern')) #sort alphabetically return nice_urls 

和模板:

 <ul> {% for link in links %} <li> {{link.pattern}} ----- {{link.location}} </li> {% endfor%} </ul> 

如果你想获得真正的幻想,你可以渲染列表中的任何正则expression式,把variables传递给视图(再次作为开发人员工具,而不是生产页面)的input框。

这个问题有点老了,但我遇到了同样的问题,我想我会讨论我的解决scheme。 一个给定的Django项目显然需要知道所有URL的方法,并且需要能够做一些事情:

  1. 从url – >视图中映射
  2. 从命名的url – > url(然后1用于获取视图)
  3. 从视图名称 – > url(然后1用于获取视图)

Django主要通过一个名为RegexURLResolver的对象完成此RegexURLResolver

  1. RegexURLResolver.resolve(从url – >视图映射)
  2. RegexURLResolver.reverse

您可以通过以下方式获取这些对象之一:

 from my_proj import urls from django.core.urlresolvers import get_resolver resolver = get_resolver(urls) 

那么,你可以简单地打印出你的url如下:

 for view, regexes in resolver.reverse_dict.iteritems(): print "%s: %s" % (view, regexes) 

也就是说,阿拉斯代尔的解决scheme是完美的,有一些优点,因为它打印出比这个方法更好的东西。 但了解并掌握RegexURLResolver对象是一件很RegexURLResolver的事情,特别是如果你对Django内部感兴趣的话。

我已经提交了一个包(django-showurls),它将这个function添加到了任何Django项目中,这是一个与manage.py很好地集成的简单的新pipe理命令:

 $ python manage.py showurls ^admin/ ^$ ^login/$ ^logout/$ .. etc .. 

你可以通过pip安装它:

 pip install django-showurls 

然后将其添加到您的Django项目settings.py文件中安装的应用程序:

 INSTALLED_APPS = [ .. 'django_showurls', .. ] 

你准备好了。

更多信息在这里 – https://github.com/Niklas9/django-showurls

获取完整注册URL列表的最简单方法是安装contrib.admindocs,然后检查“视图”部分。 非常容易设置,并且还为您提供了所有模板标签,模型等的完整浏览文档。

您是否正在寻找评估或未评估的url,如DEBUG模式所示? 对于评估,django.contrib.sitemaps可以帮助你,否则可能会涉及到一些使用Django代码的逆向工程。

当我在这里尝试其他答案时,我得到了这个错误:

django.core.exceptions.AppRegistryNotReady:应用程序尚未加载。

它看起来像问题来自我的urls.py使用django.contrib.admin.autodiscover() ,所以我可以注释掉,或在转储URL之前正确加载Django。 当然,如果我想查看映射中的pipe理url,我不能评论它们。

我发现的方式是创build一个自定义的pipe理命令来转储url。

 # install this file in mysite/myapp/management/commands/urldump.py from django.core.management.base import BaseCommand from kive import urls class Command(BaseCommand): help = "Dumps all URL's." def handle(self, *args, **options): self.show_urls(urls.urlpatterns) def show_urls(self, urllist, depth=0): for entry in urllist: print ' '.join((" " * depth, entry.regex.pattern, entry.callback and entry.callback.__module__ or '', entry.callback and entry.callback.func_name or '')) if hasattr(entry, 'url_patterns'): self.show_urls(entry.url_patterns, depth + 1) 

如果你在debugging模式下运行Django(在你的设置中有DEBUG = True ),然后input一个不存在的URL,你会得到一个列出完整URLconfiguration的错误页面。