有没有办法获得完整 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)
答案 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
包含RegexURLPattern
和RegexURLResolver
个对象。
对于RegexURLPattern
对象p
,您可以使用
p.regex.pattern
对于代表包含网址配置的RegexURLResolver
对象q
,您可以使用
q.regex.pattern
然后使用
q.url_patterns
将返回RegexURLResolver
和RegexURLPattern
个对象的进一步列表。
答案 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的方法,并且需要能够做一些事情:
Django主要通过一个名为RegexURLResolver
的对象实现这一目标。
您可以通过以下方式获取其中一个对象:
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',
..
]
你准备好了。
答案 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配置。