如何在Django / Python应用程序启动时执行装饰器功能?

时间:2018-01-16 20:21:17

标签: python django python-3.x python-decorators

我有许多类,我希望在其上运行装饰器功能。正如我所知,装饰器只在类/函数/它们标记的任何东西被加载到代码中时才会运行。

e.g。

def decorator(cls):
  print("Decorator executed")
  return cls

@decorator
class Example:
  pass

Example()

如何触发装饰器在启动 django应用程序 时标记的所有类上的装饰器功能,而无需单独加载每个类? (或者不知道装饰者标记的类)

1 个答案:

答案 0 :(得分:0)

解决方案更新:

我有一堆类,我想在其上运行一个装饰器函数,它们的类名都包含'Model'。类的装饰器是在导入给定类时执行的,因此我可以通过解决方法创建一个函数(在启动时运行)来导入所有在类名中包含“Model”的类,并作为副产品装饰函数针对所有这些类运行。

import glob
import importlib.util


def execute_decorator_against_classes():
    for filename in glob.iglob("**/*Model.py",
                               recursive=True):
        module_name = filename.split("/")
        module_name = module_name[len(module_name) - 1]
        module_name = module_name[:module_name.rfind('.py')]
        spec = importlib.util.spec_from_file_location(module_name,
                                                      filename)
        foo = importlib.util.module_from_spec(spec)
        spec.loader.exec_module(foo)