如何在Django中将命令行参数传递给自定义装饰器?
解决思路
问题的核心是:装饰器在类加载阶段就会执行,这时候命令行参数还没被解析,根本拿不到options["name"]的值。必须换个思路,把参数获取的时机延迟到handle方法运行时。
方案一:无参数装饰器,直接在包装函数里取参数
修改装饰器结构,让它在包裹的函数执行时(也就是handle运行阶段)从options中提取命令行参数:
def deco(func): def wrapper(self, *_args, **options): # 此时命令行参数已解析完成,可直接获取name name = options["name"] # 这里写你的装饰器逻辑,比如用name做日志、权限校验等 print(f"装饰器拿到命令行参数name: {name}") # 调用原handle方法 return func(self, *_args, **options) return wrapper
使用时直接挂载装饰器即可,无需传参:
class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument( "--name", type=str, required=True, ) @deco def handle(self, *_args, **options): name = options["name"] # 你的业务逻辑代码
方案二:带参数名的装饰器,灵活指定目标参数
如果需要装饰器适配不同的命令行参数名,可以让装饰器先接收参数名称,再在运行时从options中提取对应值:
def deco(param_name): # 第一层接收要提取的参数名,比如"name" def decorator(func): def wrapper(self, *_args, **options): # 根据传入的参数名从options中取值 target_value = options[param_name] # 装饰器逻辑 print(f"装饰器获取到参数{param_name}: {target_value}") return func(self, *_args, **options) return wrapper return decorator
使用时传入目标参数的名称:
class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument( "--name", type=str, required=True, ) @deco("name") def handle(self, *_args, **options): name = options["name"] # 你的业务逻辑代码
内容的提问来源于stack exchange,提问作者E_K
相关产品推荐
相关产品推荐

