确定完整的Django URL配置


82

有没有一种方法来获取完整的Django URL配置?

例如,Django的调试404页面未显示包含的url配置,因此这不是完整的配置。


:感谢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)

2
非常有用的脚本,谢谢
RichVel

Answers:


49

Django是Python,因此内省是您的朋友。

在外壳中,导入urls。通过循环浏览urls.urlpatterns并尽可能深入地查看所包括的url配置的各个层,您可以构建完整的url配置。

import urls
urls.urlpatterns

该列表urls.urlpatterns包含RegexURLPatternRegexURLResolver对象。

对于RegexURLPattern对象,p您可以使用

p.regex.pattern

对于表示包含的url配置的RegexURLResolver对象q,您可以使用来显示正则表达式的第一部分

q.regex.pattern

然后使用

q.url_patterns

这将返回RegexURLResolverRegexURLPattern对象的进一步列表。


3
好主意!我在这里制作了一个简单的脚本:code.activestate.com/recipes/576974
Michael

这是一个优雅的功能。我开始尝试编写一个对象,但是它涉及检查对象类型以查看它们是否为RegexURLPatternRegexURLResolver。使用has_attr是一个更好的主意。您应该在Stack Overflow的答案中放入函数。我会赞成。
阿拉斯戴尔

这会导致通过设置文件的大量循环导入问题!!
NoobEditor

67

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

pip install django-extensions

然后在中将其添加django_extensions到您的INSTALLED_APPS中settings.py。然后从控制台中键入以下内容

python manage.py show_urls

2
便利!我认为我永远不会发现这一点。谢谢!
蒂姆·鲁迪克2014年

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>

如果您想花大价钱,可以为带有变量的任何正则表达式的输入框呈现列表,这些正则表达式可以将变量传递到视图(再次作为开发人员工具而不是生产页面)。


4

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

  1. 从网址映射->视图
  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)

然后,您可以通过以下方式简单地打印出网址:

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

就是说,Alasdair的解决方案非常好,并且具有一些优势,因为它可以打印出比此方法更好的解决方案。但是了解并熟悉RegexURLResolver对象是一件很不错的事情,特别是如果您对Django内部感兴趣的话。


2

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

$ 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


好的谢谢。如果在每条树线的旁边都有定义规则的应用程序名称(或检测应用程序的某种类似方式),则可能会很有用。
VedranŠego'16

需要注意的是Django的扩展还包括一个show_urls命令- django-extensions.readthedocs.io/en/latest/...
泰勒Edmiston的

1

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


0

您是否正在寻找DEBUG模式中显示的已评估或未评估的网址?为了获得评估,django.contrib.sitemaps可以为您提供帮助,否则可能涉及使用Django代码进行一些反向工程。


0

当我在这里尝试其他答案时,出现此错误:

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

看来问题出django.contrib.admin.autodiscover()在我的中urls.py,因此我可以将其注释掉,或者在转储URL之前正确加载Django。当然,如果我想在映射中看到管理URL,则无法将其注释掉。

我发现的方法是创建一个自定义管理命令来转储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)

-3

如果您在调试模式下运行Django(已DEBUG = True进行设置),然后键入不存在的URL,您将看到一个错误页面,其中列出了完整的URL配置。


正如我提到的,此错误页面没有显示完整的配置,因为它不包含有关所包含的url配置的信息。
迈克尔

我完全了解您对包含URL配置的含义,但是由于我无法立即访问测试站点,因此出现了内存错误的回答。我发誓我已经看到URL错误页面在顶级URL和包含的URL之间放置了一个空格,但是现在看不到了。因此,答案是否定的,无法看到完整的配置。
范·盖尔

错误页面仅显示相关的包含的url配置。EG的404页面/news/bad_url/将显示news应用程序中包含的网址,但不显示应用程序中的网址sport
阿拉斯戴尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.