确定完整的Django url配置

Mic*_*ael 80 python django url

有没有办法获得完整的 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)
Run Code Online (Sandbox Code Playgroud)

Ala*_*ars 66

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

pip install django-extensions
Run Code Online (Sandbox Code Playgroud)

然后添加django_extensions到您的INSTALLED_APPS中settings.py.然后从控制台输入以下内容

python manage.py show_urls
Run Code Online (Sandbox Code Playgroud)

  • 便利!我认为我永远不会发现这一点。谢谢! (2认同)

Ala*_*air 47

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

在shell中,导入urls.通过循环遍历urls.urlpatterns并向下钻取尽可能多的包含URL配置层,您可以构建完整的URL配置.

import urls
urls.urlpatterns
Run Code Online (Sandbox Code Playgroud)

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

对于RegexURLPattern对象,p您可以显示正则表达式

p.regex.pattern
Run Code Online (Sandbox Code Playgroud)

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

q.regex.pattern
Run Code Online (Sandbox Code Playgroud)

然后用

q.url_patterns
Run Code Online (Sandbox Code Playgroud)

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

  • 好主意!我在这里制作了一个简单的脚本:http://code.activestate.com/recipes/576974/ (3认同)

and*_*ndy 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
Run Code Online (Sandbox Code Playgroud)

和模板:

<ul>
{% for link in links %}
<li>
{{link.pattern}}   -----   {{link.location}}
</li>
{% endfor%}
</ul>
Run Code Online (Sandbox Code Playgroud)

如果你想得到真正的想象,你可以使用输入框为任何正则表达式渲染列表,这些正则表达式将变量传递给视图(再次作为开发人员工具而不是生产页面).


abh*_*man 5

这个问题有点老了,但我遇到了同样的问题,我想我会讨论我的解决方案。给定的 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)
Run Code Online (Sandbox Code Playgroud)

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

for view, regexes in resolver.reverse_dict.iteritems():
    print "%s: %s" % (view, regexes)
Run Code Online (Sandbox Code Playgroud)

也就是说,Alasdair 的解决方案非常好,并且具有一些优点,因为它打印出的内容比这种方法更好。但是了解并掌握一个RegexURLResolver对象是一件很值得了解的事情,特别是如果您对 Django 内部结构感兴趣的话。