确定完整的Django url配置

时间:2009-12-01 19:05:15

标签: python django url

有没有办法获得完整 django网址配置?

例如,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)

9 个答案:

答案 0 :(得分:65)

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

pip install django-extensions

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

python manage.py show_urls

答案 1 :(得分:46)

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

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

import urls
urls.urlpatterns

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

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

显示正则表达式
p.regex.pattern

对于代表包含网址配置的RegexURLResolver对象q,您可以使用

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

然后使用

q.url_patterns

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

答案 2 :(得分: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>

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

答案 3 :(得分:4)

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

  1. 来自网址的地图 - &gt;图
  2. 从已命名的网址映射 - &gt; url(然后1用于获取视图)
  3. 从视图名称映射 - &gt; url(然后1用于获取视图)
  4. Django主要通过一个名为RegexURLResolver的对象实现这一目标。

    1. RegexURLResolver.resolve(来自网址的地图 - &gt;视图)
    2. RegexURLResolver.reverse
    3. 您可以通过以下方式获取其中一个对象:

      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内部感兴趣的话。

答案 4 :(得分: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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

  

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

看起来问题来自于在我的Host中使用django.contrib.admin.autodiscover(),因此我可以对其进行评论,或者在转储URL之前正确加载Django。当然,如果我想在映射中看到管理员URL,我就不能对它们进行评论。

我找到的方法是创建一个转储网址的custom management command

urls.py

答案 8 :(得分:-3)

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