确定完整的Django urlconfiguration
有没有办法获得完整的 Django的urlconfiguration?
例如,Django的debugging404页面不显示包含的URLconfiguration,所以这不是完整的configuration。
答 :感谢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)
Django是Python,所以内省是你的朋友。
在shell中,导入urls
。 通过循环遍历urls.urlpatterns
,并尽可能多的层层包含urlconfiguration,你可以构build完整的urlconfiguration。
import urls urls.urlpatterns
列表urls.urlpatterns
包含RegexURLPattern
和RegexURLResolver
对象。
对于RegexURLPattern
对象p
,可以用正则expression式显示
p.regex.pattern
对于表示包含的urlconfiguration的RegexURLResolver
对象q
,可以显示正则expression式的第一部分
q.regex.pattern
然后使用
q.url_patterns
这将返回RegexURLResolver
和RegexURLPattern
对象的更多列表。
Django扩展提供了一个实用程序来执行此操作作为manage.py命令。
pip install django-extensions
然后将django_extensions
添加到django_extensions
中的INSTALLED_APPS。 然后从控制台input以下内容
python manage.py show_urls
在添加“我也是”答案的风险中,我发布了上述提交的脚本的修改版本,该脚本给出了一个视图,列出项目中的所有URL,按照字母顺序进行了一些修饰和sorting,以及他们所调用的视图。 更多的是开发者工具而不是生产页面。
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>
如果你想获得真正的幻想,你可以渲染列表中的任何正则expression式,把variables传递给视图(再次作为开发人员工具,而不是生产页面)的input框。
这个问题有点老了,但我遇到了同样的问题,我想我会讨论我的解决scheme。 一个给定的Django项目显然需要知道所有URL的方法,并且需要能够做一些事情:
- 从url – >视图中映射
- 从命名的url – > url(然后1用于获取视图)
- 从视图名称 – > url(然后1用于获取视图)
Django主要通过一个名为RegexURLResolver
的对象完成此RegexURLResolver
。
- RegexURLResolver.resolve(从url – >视图映射)
- 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)
也就是说,阿拉斯代尔的解决scheme是完美的,有一些优点,因为它打印出比这个方法更好的东西。 但了解并掌握RegexURLResolver
对象是一件很RegexURLResolver
的事情,特别是如果你对Django内部感兴趣的话。
我已经提交了一个包(django-showurls),它将这个function添加到了任何Django项目中,这是一个与manage.py很好地集成的简单的新pipe理命令:
$ python manage.py showurls ^admin/ ^$ ^login/$ ^logout/$ .. etc ..
你可以通过pip安装它:
pip install django-showurls
然后将其添加到您的Django项目settings.py文件中安装的应用程序:
INSTALLED_APPS = [ .. 'django_showurls', .. ]
你准备好了。
获取完整注册URL列表的最简单方法是安装contrib.admindocs,然后检查“视图”部分。 非常容易设置,并且还为您提供了所有模板标签,模型等的完整浏览文档。
您是否正在寻找评估或未评估的url,如DEBUG模式所示? 对于评估,django.contrib.sitemaps可以帮助你,否则可能会涉及到一些使用Django代码的逆向工程。
当我在这里尝试其他答案时,我得到了这个错误:
django.core.exceptions.AppRegistryNotReady:应用程序尚未加载。
它看起来像问题来自我的urls.py
使用django.contrib.admin.autodiscover()
,所以我可以注释掉,或在转储URL之前正确加载Django。 当然,如果我想查看映射中的pipe理url,我不能评论它们。
我发现的方式是创build一个自定义的pipe理命令来转储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)
如果你在debugging模式下运行Django(在你的设置中有DEBUG = True
),然后input一个不存在的URL,你会得到一个列出完整URLconfiguration的错误页面。