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)
Ala*_*air 47
Django是Python,所以内省是你的朋友.
在shell中,导入urls.通过循环遍历urls.urlpatterns并向下钻取尽可能多的包含URL配置层,您可以构建完整的URL配置.
import urls
urls.urlpatterns
Run Code Online (Sandbox Code Playgroud)
该列表urls.urlpatterns包含RegexURLPattern和RegexURLResolver对象.
对于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)
这将返回另一个RegexURLResolver和RegexURLPattern对象列表.
冒着添加"我也是"答案的风险,我发布了上面提交的脚本的修改版本,它提供了一个视图,列出了项目中的所有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)
如果你想得到真正的想象,你可以使用输入框为任何正则表达式渲染列表,这些正则表达式将变量传递给视图(再次作为开发人员工具而不是生产页面).
这个问题有点老了,但我遇到了同样的问题,我想我会讨论我的解决方案。给定的 Django 项目显然需要一种了解其所有 URL 的方法,并且需要能够执行以下操作:
Django 主要通过一个名为 的对象来实现这一点RegexURLResolver。
您可以通过以下方式获得这些对象之一:
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 内部结构感兴趣的话。
| 归档时间: |
|
| 查看次数: |
17762 次 |
| 最近记录: |