【问题标题】:How to execute a decorator function at startup in a Django/Python Application?如何在 Django/Python 应用程序中启动时执行装饰器功能?
【发布时间】:2023-03-16 21:48:01
【问题描述】:

我有许多类,我希望在这些类上运行装饰器函数。据我所知,装饰器仅在将类/函数/它们标签的任何内容加载到代码中时运行。

例如

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

@decorator
class Example:
  pass

Example()

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

【问题讨论】:

  • 装饰器不应该这样工作,也许要重新考虑你想要实现的目标。

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


【解决方案1】:

解决方案更新:

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

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)

【讨论】:

    猜你喜欢
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    相关资源
    最近更新 更多