django - 如何使用多个参数制作自定义装饰器?
问题描述
在这里,我正在使用一些 kwargs 参数制作自定义装饰器,但装饰器无法正常工作。
错误:
TypeError: my_decorator() takes 1 positional argument but 2 were given
代码
def my_decorator(title, **data):
def _method_wrapper(view_method):
def _arguments_wrapper(request, *args, **kwargs) :
obj = Model.objects.get(title=title)
if obj.relatedmodel_set.filter(**data).exists():
return view_method(request, *args, **kwargs)
raise PermissionDenied
return _arguments_wrapper
return _method_wrapper
#view
@my_decorator('title', {'is_manager':True})
def my_view(request, id):
解决方案
您使用**data
,因此这意味着您可以传递命名参数,然后data
是一个将字符串映射到相应项目的字典。
因此,您可以调用@my_decorator
:
@my_decorator('title', is_manager=True)
…
如果您希望能够传递位置参数,例如Q
对象,您可以使用以下方式扩展签名:
def my_decorator(title, *data, **datb):
def _method_wrapper(view_method):
def _arguments_wrapper(request, *args, **kwargs) :
obj = Model.objects.get(title=title)
if obj.relatedmodel_set.filter(*data, **datb).exists():
return view_method(request, *args, **kwargs)
raise PermissionDenied
return _arguments_wrapper
return _method_wrapper
在这种情况下,您可以使用以下方法调用装饰器:
from django.db.models import Q
@my_decorator('title', Q(is_manager=True))
…
推荐阅读
- python - 如何检查一个变量的两个条件?
- fabricjs - fabricjs 剪辑路径不按尺寸工作
- vb.net - Tapi 与团队/其他 cisco 系统一起使用
- javascript - ESLint:让它理解///
VS Code 中有什么方法可以让 ESLint 理解
/// <reference path
指令,这样它就不会no-undef
为引用的 JS 文件中定义的变量/函数抛出错误?它似乎以某种方式工作,但不完全:VS Code function descri
- php - 获取当前路由规则
- bash - 遍历给定文件夹的文件 - Bash
- jquery - 按文本而不是它的值对数据表列进行排序
- grpc - 这对 proto 文件来说是一个糟糕的结构吗
- c# - 父实体上的软删除,但子/关系 EF Core 上的硬删除
- python - 无法同时运行烧瓶和 scapy