2009-12-01 75 views
71

有没有办法让完成 django url配置?确定完整的Django url配置

例如,Django的调试404页面没有显示包含的url configs,所以这不是完整的配置。


:感谢阿拉斯代尔,这里是一个示例脚本:

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) 
+2

非常有用的脚本,谢谢 – RichVel 2012-12-09 07:04:44

回答

44

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

在shell中,导入urls。通过循环遍历urls.urlpatterns,并尽可能深入地包含尽可能多的包含url配置的层,您可以构建完整的url配置。

import urls 
urls.urlpatterns 

列表urls.urlpatterns包含RegexURLPatternRegexURLResolver对象。

对于RegexURLPattern对象p可以显示与

p.regex.pattern 

正则表达式对于RegexURLResolver对象q,其表示包括URL配置,可以用

显示正则表达式的第一部分
q.regex.pattern 

然后用

q.url_patterns 

这将返回另一个RegexURLResolverRegexURLPattern对象的列表。

+3

好主意!我在这里做了一个简单的脚本:http://code.activestate.com/recipes/576974/ – Michael 2009-12-03 18:20:45

+0

这是一个优雅的功能。我开始尝试编写一个,但它涉及检查对象类型以查看它们是否是'RegexURLPattern'或'RegexURLResolver'。使用'has_attr'是一个更好的主意。你应该把你的函数放在Stack Overflow的回答里。我会赞成它。 – Alasdair 2009-12-03 23:37:17

+0

这会通过设置文件导致很多循环导入问题! – NoobEditor 2017-04-05 09:56:08

-3

如果你在调试模式下运行的Django(有DEBUG = True在你的设置),然后输入一个不存在的URL将会出现一个错误页面,列出完整的URL配置。

+0

正如我提到的,这个错误页面不显示完整的配置,因为它不包括有关*包括* URL配置的信息。 – Michael 2009-12-01 21:35:48

+0

我完全理解你对包含URL配置的含义,但是从错误的内存中回答,因为我没有立即访问测试站点。我发誓我已经看到URL错误页面在顶层url和包含的url之间放置一个空格,但现在看不到。所以答案是否定的,没有办法看到完整的配置。 – 2009-12-01 21:49:38

+0

错误页面仅显示_relevant_包含的url配置。例如。 '/ news/bad_url /'的404页面将显示来自'news'应用的包含url,但不会来自'sport'应用。 – Alasdair 2009-12-01 22:50:15

0

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

6

在添加“我也是”答案的风险中,我发布了上述提交脚本的修改版本,该脚本提供了一个视图,列出了项目中所有的URL,有点美化和按字母顺序排序,他们打电话。更多的是开发者工具而不是生产页面。

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> 

如果你想获得真正看中的,你可以渲染与任何采取变量的正则表达式的输入框列表传递给视图(再次作为开发人员工具而不是生产页面)。

1

获取完整注册URL列表的最简单方法是安装contrib.admindocs,然后检查“视图”部分。很容易建立,也为您提供了完全可浏览的文档上所有的模板标签,型号等

57

Django的扩展提供了一个工具来做到这一点作为一个manage.py命令。

pip install django-extensions 

然后在settings.py添加django_extensions到您的INSTALLED_APPS。然后从控制台只需键入以下

python manage.py show_urls 
+1

方便!我不认为我会发现这一点。谢谢! – 2014-05-09 23:54:22

+0

太棒了!谢谢! – mawaldne 2015-06-10 15:27:46

+0

这是正确的答案 – abbood 2016-07-17 06:48:05

4

这个问题是有点老了,但我遇到了同样的问题,我想我会讨论我的解决方案。一个给定的Django项目显然需要知道关于它的所有URL的手段,需要能够做两件事情:

  1. 从URL地图 - >查看
  2. 地图从命名URL - > URL(然后1用于获取视图)
  3. 从一个视图名称地图 - > URL(1然后被用来获取视图)

Django的实现这一点主要是通过一个对象称为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) 

也就是说,Alasdair的解决方案非常好,并且具有一些优势,因为它打印出比这种方法更好的东西。但对此有所了解,并让你的手一RegexURLResolver对象是一些好听的了解,特别是如果你有兴趣在Django内部。

0

当我试图在这里其他的答案,我得到这个错误:

django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

它看起来像这个问题来自于我的urls.py使用django.contrib.admin.autodiscover(),所以我可以评论说出来,或者正确之前加载的Django转储网址。当然,如果我想看到管理的URL中的映射,我不能评论出来。

我发现的方式是创建一个custom management command转储网址。

# 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) 
2

我已经提交了一个包(Django的showurls),增加了这个功能,任何Django项目,这是一个简单的新的管理命令与manage.py很好地结合:

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

您可以安装它通过点:

pip install django-showurls 

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

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

而你准备好了。

更多资讯 - https://github.com/Niklas9/django-showurls

+0

不错,谢谢。如果在每行树旁边有定义规则的应用程序的名称(或者类似的检测应用程序的方式),它可能会很有用。 – 2016-05-22 23:18:52

+0

请注意,Django扩展还包括一个'show_urls'命令 - http://django-extensions.readthedocs.io/en/latest/command_extensions.html – 2016-07-25 14:59:35