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配置。您是在寻找已评估的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
对象的进一步列表。冒着添加“我也是”答案的风险,我发布了上述提交脚本的修改版本,该脚本为您提供了一个视图,列出了项目中的所有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的完整列表的最简单方法是安装,然后检查“视图”部分。非常容易设置,还可以让您在所有模板标签、模型等上完全浏览文档。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的解决方案非常好,并且有一些优势,因为它打印出了比这种方法更好的内容。但是了解并掌握RegeSurlResolver
对象是一件很好的事情,特别是如果您对Django内部结构感兴趣的话。当我在这里尝试其他答案时,我遇到了以下错误:
django.core.exceptions.AppRegistryNotReady:尚未加载应用程序
问题似乎来自于在我的URL.py
中使用django.contrib.admin.autodiscover()
,因此我可以对此进行注释,或者在转储URL之前正确加载django。当然,如果我想在映射中看到管理员URL,我不能将它们注释掉
我找到的方法是创建一个转储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)
我已经提交了一个包(django showurls),它将此功能添加到任何django项目中,这是一个简单的新管理命令,与manage.py集成良好:
$ python manage.py showurls
^admin/
^$
^login/$
^logout/$
.. etc ..
您可以通过pip进行安装:
pip install django-showurls
然后将其添加到Django project settings.py文件中已安装的应用程序中:
INSTALLED_APPS = [
..
'django_showurls',
..
]
你准备好出发了
更多信息请点击这里-
正如我所提到的,此错误页面没有显示完整的配置,因为它没有包含有关包含的url配置的信息。我完全理解您关于包含的url配置的意思,但由于我没有立即访问测试站点的权限,所以从错误的内存中进行了回答。我发誓我已经看到URL错误页面在顶级URL和包含的URL之间放置了一个空格,但是现在它没有。因此答案是否定的,无法查看完整的配置。错误页面仅显示相关的包含url配置。例如,/news/bad_url/
的404页面将显示新闻
应用程序中包含的url,但不会显示体育
应用程序中包含的url。好主意!我在这里做了一个简单的脚本:这是一个优雅的函数。我开始尝试编写一个,但它涉及检查对象类型,看看它们是RegexURLPattern
还是regexurresolver
。使用has\u attr
是一个更好的主意。您应该在堆栈溢出时将函数放在这里的answer中。这会通过设置文件导致大量的循环导入问题!!非常有用的脚本,谢谢Shandy!我不认为我会发现这一点。谢谢很好,谢谢。如果在每个树行旁边都有定义规则的应用程序的名称(或检测应用程序的类似方式),那么这可能会很有用。请注意,Django扩展还包括一个show\u url
com