确定完整的Django URL配置

88

有没有一种方法可以获得完整的Django URL配置?

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


1
答案不应该被包含在问题中,而应该作为一个单独的回答发布... - aschipfl
10个回答

73

Django扩展提供了一个作为manage.py命令执行此操作的工具。

pip install django-extensions

settings.py中的INSTALLED_APPS添加django_extensions。然后只需从控制台键入以下内容

python manage.py show_urls

48

Django是Python编写的,因此内省(introspection)是你的朋友。

在shell中导入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
好主意!我在这里编写了一个简单的脚本:http://code.activestate.com/recipes/576974/ - Michael
这是一个优雅的函数。我开始尝试编写一个,但它涉及检查对象类型,以查看它们是否为“RegexURLPattern”或“RegexURLResolver”。使用“has_attr”是一个更好的想法。你应该把你的函数放在Stack Overflow上的答案中。我会给它点赞。 - Alasdair
这会在设置文件中引起很多循环导入问题!! - NoobEditor
1
这个不起作用。import urls 引发了异常:ModuleNotFoundError: No module named 'urls' - WhyWhat

7

冒着增加“me too”回答的风险,我发布了上述提交脚本的修改版本,它可以为您提供项目中所有URL的视图列表,而且这些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>

如果你想要更加高级,你可以使用输入框来渲染列表中的任何正则表达式,以便将变量传递到视图中(这只是作为开发者工具而非生产页面)。

我收到了 AttributeError: 'URLResolver' 对象没有属性 'regex' 的错误。 - guettli

5
这个问题有点老了,但我遇到了同样的问题,所以我想讨论一下我的解决方案。显然,给定的Django项目需要知道所有URL的信息,并且需要能够执行几个操作:
  1. 从url映射到视图
  2. 从命名url映射到url(然后使用1获取视图)
  3. 从视图名称映射到url(然后使用1获取视图)
通过一个称为RegexURLResolver的对象,Django主要实现了这一点。
  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内部感兴趣。


2
如果您想获取项目中所有URL的列表,则首先需要安装django-extensions。
您可以使用以下命令进行简单安装。
pip install django-extensions

要了解有关软件包的更多信息,请访问django-extensions

之后,像这样在您的settings.py文件中添加django_extensionsINSTALLED_APPS

INSTALLED_APPS = (
...
'django_extensions',
...
)

urls.py的例子:

from django.urls import path, include
from . import views
from . import health_views

urlpatterns = [
    path('get_url_info', views.get_url_func),
    path('health', health_views.service_health_check),
    path('service-session/status', views.service_session_status)
]

然后,在终端中运行任何命令

python manage.py show_urls

或者

./manage.py show_urls

基于配置文件urls.py的示例输出:

/get_url_info             django_app.views.get_url_func
/health                   django_app.health_views.service_health_check
/service-session/status   django_app.views.service_session_status

了解更多信息,请查看文档


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
请注意,Django扩展还包括一个show_urls命令 - http://django-extensions.readthedocs.io/en/latest/command_extensions.html - Taylor D. Edmiston

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

0

当我尝试其他答案时,我得到了以下错误:

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

看起来问题来自于在我的urls.py中使用django.contrib.admin.autodiscover(),所以我可以将其注释掉,或者在转储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)

0
你是在寻找在DEBUG模式下评估或未评估的URL吗?如果是已评估的,django.contrib.sitemaps可以帮助你,否则可能需要进行一些Django代码的逆向工程。

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

正如我所提到的,此错误页面未显示完整配置,因为它不包括有关已包含的URL配置信息。 - Michael
我理解您所说的“INCLUDED URL配置”意思,但由于没有立即访问测试站点的权限,我的回答来自于有误的记忆。我发誓我曾看到过URL错误页面在顶级URL和包含的URL之间放置了一个空格,但现在看来并非如此。因此,答案是“否”,无法查看完整的配置。 - Van Gale
错误页面仅显示与之相关的包含URL配置。例如,/news/bad_url/ 的404页面将显示来自“新闻”应用程序的包含URL,但不会显示来自“体育”应用程序的包含URL。 - Alasdair

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接