如何获取django应用程序中所有视图的列表?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获取django应用程序中所有视图的列表?相关的知识,希望对你有一定的参考价值。
有没有办法在django应用程序中获取所有视图的列表?我用Google搜索了答案。所有答案都显示了获取网址列表的方法。
获取Django项目的所有视图的列表:
为了获得Django项目中的所有视图,我们创建了一个函数get_all_view_names()
,它将urlpatterns
作为输入,并返回项目中使用的完整视图列表作为输出。
首先,我们使用root_urlconf
导入settings.ROOT_URLCONF
模块。然后root_urlconf.urls.urlpatterns
将给我们项目的urlpatterns列表。
上面的urlpatterns列表包含RegexURLPattern
和RegexURLResolver
对象。在.urlpatterns
上访问RegexURLResolver
将进一步为我们提供RegexURLPattern
和RegexURLResolver
对象的列表。
RegexURLPattern
对象将为我们提供我们感兴趣的视图名称。其上的callback
属性包含可调用视图。当我们在我们的网址中传递一个字符串,如'foo_app.views.view_name'
表示模块的路径和视图函数名称,或者一个可调用的视图,然后将callback
属性设置为this。进一步访问.func_name
将为我们提供视图名称。
我们递归地调用函数get_all_view_names()
并将从RegexURLPattern
对象获得的视图名称添加到全局列表VIEW_NAMES
。
from django.conf import settings
from django.core.urlresolvers import RegexURLResolver, RegexURLPattern
root_urlconf = __import__(settings.ROOT_URLCONF) # import root_urlconf module
all_urlpatterns = root_urlconf.urls.urlpatterns # project's urlpatterns
VIEW_NAMES = [] # maintain a global list
def get_all_view_names(urlpatterns):
global VIEW_NAMES
for pattern in urlpatterns:
if isinstance(pattern, RegexURLResolver):
get_all_view_names(pattern.url_patterns) # call this function recursively
elif isinstance(pattern, RegexURLPattern):
view_name = pattern.callback.func_name # get the view name
VIEW_NAMES.append(view_name) # add the view to the global list
return VIEW_NAMES
get_all_view_names(all_urlpatterns)
获取Django应用程序中所有视图的列表:
要获取Django应用程序中存在的所有视图的列表,我们将使用上面定义的get_all_view_names()
函数。
我们将首先导入应用程序的所有urlpatterns
并将此列表传递给get_all_view_names()
函数。
from my_app.urls import urlpatterns as my_app_urlpatterns # import urlpatterns of the app
my_app_views = get_all_view_names(my_app_urlpatterns) # call the function with app's urlpatterns as the argument
my_app_views
为我们提供了my_app
Django应用程序中所有视图的列表。
除了Rahul上面的修复,如果有人使用Python3,你将需要使用__name__
而不是func_name
:
...
view_name = pattern.callback.__name__
...
否则你会得到以下内容:
AttributeError: 'function' object has no attribute 'get_all_view_names'
(感谢scipy-gitbot的https://github.com/scipy/scipy/issues/2101#issuecomment-17027406
作为替代方案,如果您不愿意使用全局变量,那么我最终使用的是:
all_urlpatterns = __import__(settings.ROOT_URLCONF).urls.urlpatterns
detail_views_list = []
def get_all_view_names(urlpatterns):
for pattern in urlpatterns:
if isinstance(pattern, RegexURLResolver):
get_all_view_names(pattern.url_patterns)
elif isinstance(pattern, RegexURLPattern):
detail_views_list.append(pattern.callback.__name__)
get_all_view_names(all_urlpatterns)
all_views_list = []
# remove redundant entries and specific ones we don't care about
for each in detail_views_list:
if each not in "serve add_view change_view changelist_view history_view delete_view RedirectView":
if each not in all_views_list:
all_views_list.append(each)
然后你可以通过all_views_list
迭代来获得过滤后的视图列表。
更新:2018年3月1日
在Django 2.0中,django.core.urlresolvers
被转移到django.urls
。 RegexURLPattern
和RegexURLResolver
更名为URLPattern
和URLResolver
。所以你应该使用
from django.urls import URLResolver, URLPattern
代替
from django.core.urlresolvers import RegexURLResolver, RegexURLPattern
如果你使用Django 2。
以上是关于如何获取django应用程序中所有视图的列表?的主要内容,如果未能解决你的问题,请参考以下文章