有没有一种方法可以获得完整的Django URL配置?
例如,Django的调试404页面不显示已包含的URL配置,因此这不是完整的配置。
Django扩展提供了一个作为manage.py命令执行此操作的工具。
pip install django-extensions
在settings.py
中的INSTALLED_APPS
添加django_extensions
。然后只需从控制台键入以下内容
python manage.py show_urls
Django是Python编写的,因此内省(introspection)是你的朋友。
在shell中导入urls
模块。通过循环遍历urls.urlpatterns
,并尽可能地深入包含的url配置层级,可以构建完整的url配置。
import urls
urls.urlpatterns
列表 urls.urlpatterns
包含RegexURLPattern
和RegexURLResolver
对象。
对于一个RegexURLPattern
对象p
,您可以使用以下方法显示正则表达式:
p.regex.pattern
对于表示包含的url配置的RegexURLResolver
对象q
,可以使用以下方法显示正则表达式的第一部分:
q.regex.pattern
然后使用。q.url_patterns
它将返回一个进一步的列表,其中包含RegexURLResolver
和RegexURLPattern
对象。
import urls
引发了异常:ModuleNotFoundError: No module named 'urls'
。 - WhyWhat冒着增加“me too”回答的风险,我发布了上述提交脚本的修改版本,它可以为您提供项目中所有URL的视图列表,而且这些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>
AttributeError: 'URLResolver' 对象没有属性 'regex'
的错误。 - guettliRegexURLResolver
的对象,Django主要实现了这一点。
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内部感兴趣。
pip install django-extensions
要了解有关软件包的更多信息,请访问django-extensions
之后,像这样在您的settings.py
文件中添加django_extensions
到INSTALLED_APPS
:
INSTALLED_APPS = (
...
'django_extensions',
...
)
urls.py的例子:
from django.urls import path, include
from . import views
from . import health_views
urlpatterns = [
path('get_url_info', views.get_url_func),
path('health', health_views.service_health_check),
path('service-session/status', views.service_session_status)
]
然后,在终端中运行任何命令
python manage.py show_urls
或者
./manage.py show_urls
基于配置文件urls.py的示例输出:
/get_url_info django_app.views.get_url_func
/health django_app.health_views.service_health_check
/service-session/status django_app.views.service_session_status
了解更多信息,请查看文档。
$ python manage.py showurls
^admin/
^$
^login/$
^logout/$
.. etc ..
您可以通过pip安装它:
pip install django-showurls
然后将其添加到Django项目的settings.py文件中安装的应用程序中:
INSTALLED_APPS = [
..
'django_showurls',
..
]
你已经准备好了。
show_urls
命令 - http://django-extensions.readthedocs.io/en/latest/command_extensions.html - Taylor D. Edmiston当我尝试其他答案时,我得到了以下错误:
django.core.exceptions.AppRegistryNotReady: 应用程序尚未加载。
看起来问题来自于在我的urls.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)
DEBUG = True
),然后输入一个不存在的URL,你将会得到一个错误页面,其中列出了完整的URL配置。/news/bad_url/
的404页面将显示来自“新闻”应用程序的包含URL,但不会显示来自“体育”应用程序的包含URL。 - Alasdair