Python 确定完整的Django url配置
有没有办法获得完整的django url配置 例如,Django的调试404页面没有显示包含的url配置,因此这不是完整的配置Python 确定完整的Django url配置,python,django,url,Python,Django,Url,有没有办法获得完整的django url配置 例如,Django的调试404页面没有显示包含的url配置,因此这不是完整的配置 答案:感谢阿拉斯代尔,这里有一个示例脚本: import urls def show_urls(urllist, depth=0): for entry in urllist: print(" " * depth, entry.regex.pattern) if hasattr(entry, 'url_p
答案:感谢阿拉斯代尔,这里有一个示例脚本:
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(设置中有
debug=True
),然后键入一个不存在的URL,您将获得一个错误页面,列出完整的URL配置。如果您在调试模式下运行Django(设置中有debug=True
)然后键入一个不存在的URL,您将得到一个错误页面,其中列出了完整的URL配置。您是在查找已评估的URL还是未评估的URL,如调试模式所示?对于evaluated,django.contrib.sitemaps可以帮助您,否则可能需要对django的代码进行反向工程。您是在寻找已评估的URL还是未评估的URL,如调试模式所示?对于evaluated,django.contrib.sitemaps可以帮助您实现这一点,否则可能需要对django的代码进行反向工程。django是Python,因此内省是您的朋友
在shell中,导入url
。通过循环浏览url.urlpatterns
,并深入浏览尽可能多的包含url配置的层,您可以构建完整的url配置
import urls
urls.urlpatterns
列表url.urlpatterns
包含RegexURLPattern
和RegexURLResolver
对象
对于RegexURLPattern
对象p
,可以使用
p.regex.pattern
q.regex.pattern
对于表示包含的url配置的RegexURLResolver
对象q
,可以使用
p.regex.pattern
q.regex.pattern
然后使用
q.url_patterns
它将返回
RegexURLResolver
和RegexURLPattern
对象的进一步列表。Django是Python,因此内省是您的朋友
在shell中,导入url
。通过循环浏览url.urlpatterns
,并深入浏览尽可能多的包含url配置的层,您可以构建完整的url配置
import urls
urls.urlpatterns
列表url.urlpatterns
包含RegexURLPattern
和RegexURLResolver
对象
对于RegexURLPattern
对象p
,可以使用
p.regex.pattern
q.regex.pattern
对于表示包含的url配置的RegexURLResolver
对象q
,可以使用
p.regex.pattern
q.regex.pattern
然后使用
q.url_patterns
这将返回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
以及模板:
<ul>
{% for link in links %}
<li>
{{link.pattern}} ----- {{link.location}}
</li>
{% endfor%}
</ul>
{%用于链接中的链接%}
-
{{link.pattern}------{{link.location}
{%endfor%}
如果您想真正地发挥想象力,您可以为任何接受变量传递到视图的正则表达式呈现带有输入框的列表(同样作为开发人员工具,而不是生产页面) 冒着添加“我也是”答案的风险,我发布了上述提交脚本的一个修改版本,该版本提供了一个视图,列出了项目中的所有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>
{%用于链接中的链接%}
-
{{link.pattern}------{{link.location}
{%endfor%}
如果您想真正地发挥想象力,您可以为任何接受变量传递到视图的正则表达式呈现带有输入框的列表(同样作为开发人员工具,而不是生产页面) 获取已注册URL的完整列表的最简单方法是安装,然后检查“视图”部分。非常容易设置,并且可以在所有模板标签、模型等上完全浏览文档。获取注册URL完整列表的最简单方法是安装,然后检查“视图”部分。非常容易设置,还可以让您在所有模板标签、模型等上完全浏览文档。Django extensions提供了一个实用程序,作为manage.py命令来完成此操作
pip install django-extensions
然后在settings.py
中将django\u扩展添加到已安装的应用程序中。然后从控制台键入以下命令
python manage.py show_urls
Django extensions提供了一个实用程序,可以作为manage.py命令来完成这项工作
pip install django-extensions
然后在settings.py
中将django\u扩展添加到已安装的应用程序中。然后从控制台键入以下命令
python manage.py show_urls
这个问题有点老,但我遇到了同样的问题,我想我会讨论我的解决方案。一个给定的Django项目显然需要一种了解其所有URL的方法,并且需要能够做以下几件事:
从url->视图映射
从命名url->url映射(然后使用1获取视图)
从视图名称->url映射(然后使用1获取视图)
Django主要通过一个名为RegexURLResolver
的对象来实现这一点
RegexURLResolver.resolve(从url->视图映射)
RegexURLResolver.reverse
您可以通过以下方式获得这些对象之一:
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)
然后,您可以通过以下方式简单地打印URL:
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
对象是一件很好的事情,特别是如果您是