如何获取django应用程序中所有视图的列表?

Net*_*tro 7 django django-views

有没有办法在django应用程序中获取所有视图的列表?我用Google搜索了答案.所有答案都显示了获取网址列表的方法.

Rah*_*pta 12

获取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它上面的属性包含可调用视图.当我们在我们的url中传递一个字符串,比如'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)
Run Code Online (Sandbox Code Playgroud)

获取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
Run Code Online (Sandbox Code Playgroud)

my_app_views给我们my_appDjango应用程序中存在的所有视图的列表.


Dou*_*las 7

添加Rahul的上述修复,如果有人使用Python3,您将需要使用__name__而不是func_name:

...
            view_name = pattern.callback.__name__
...
Run Code Online (Sandbox Code Playgroud)

否则你会得到以下内容:

AttributeError: 'function' object has no attribute 'get_all_view_names'
Run Code Online (Sandbox Code Playgroud)

(感谢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)
Run Code Online (Sandbox Code Playgroud)

然后,您可以迭代all_views_list以获取筛选视图的列表.

更新:2018年3月1日

在Django 2.0中,django.core.urlresolvers被移动到django.urls.RegexURLPattern和RegexURLResolver重命名为URLPattern和URLResolver.所以你应该使用

from django.urls import URLResolver, URLPattern
Run Code Online (Sandbox Code Playgroud)

代替

from django.core.urlresolvers import RegexURLResolver, RegexURLPattern
Run Code Online (Sandbox Code Playgroud)

如果你使用Django 2.