有啥方法可以获取具有装饰器、Python、Django 的视图名称列表

Posted

技术标签:

【中文标题】有啥方法可以获取具有装饰器、Python、Django 的视图名称列表【英文标题】:Is there any way to get the list of names of views having a decorator, Python, Django有什么方法可以获取具有装饰器、Python、Django 的视图名称列表 【发布时间】:2016-03-15 14:48:28 【问题描述】:

我有一个这样的views.py文件

views.py

@my_decorator
def a(request):
    return HttpResponse("success")

@my_decorator
def b(request):
    return HttpResponse("success")

@my_decorator
def c(request):
    return HttpResponse("success")

@my_decorator
def d(request):
    return HttpResponse("success")

@my_another_decorator
def e(request):
    return HttpResponse("success")

我想获取具有装饰器“my_decorator”的视图列表

例子:

views_list_with_my_decorator=["a","b","c","d"]

请帮助我,在此先感谢。

【问题讨论】:

【参考方案1】:
decorated = []
def myDecorator(fn):
    decorated.append(fn)
    ...

也许?但它只有在它们被装饰后才会起作用(即导入或以其他方式“运行”......如果它们只是坐在某处的 .py 文件中,它将不起作用)

【讨论】:

【参考方案2】:

我想你可以和医生搞点什么。以下是我的解决方案。只是为了你的灵感。你可以试试:)

from functools import wraps

def my_decorator(func):
    @wraps(func)
    def wrap_func(*args, **kwargs):
        return func()
    wrap_func.decorator = my_decorator.func_name
    return wrap_func

def my_another_decorator(func):
    @wraps(func)
    def wrap_func(*args, **kwargs):
        return func()
    wrap_func.decorator = my_another_decorator.func_name
    return wrap_func

@my_decorator
def a(request):
    pass

@my_decorator
def b(request):
    rpass

@my_decorator
def c(request):
    pass

@my_decorator
def d(request):
    pass

@my_another_decorator
def e(request):
    pass

func_list_with_my_decorator = [e for e in globals().values() if getattr(e, 'decorator', None)=='my_decorator']

print func_list_with_my_decorator

如果你想尝试一个函数是否有装饰器,这样做:

print a.decorator == 'my_decorator'

【讨论】:

以上是关于有啥方法可以获取具有装饰器、Python、Django 的视图名称列表的主要内容,如果未能解决你的问题,请参考以下文章

Python 装饰器和装饰器模式有啥区别?

这个属性装饰器(python)有啥问题[重复]

python装饰器内获取函数有用信息方法

Python 装饰器在类中获取或设置字典值

Python修饰器/装饰器专题,不动已有代码,增加新功能的好方法!

Python修饰器/装饰器专题,不动已有代码,增加新功能的好方法!