我正在尝试编写自定义装饰器。我想检查是否随请求一起发送了所有必需的参数。我写了这样的话:
def get_parameters_required(parameters=None):
missing_parameter = False
if parameters is not None:
for parameter in parameters:
if request.GET.get(parameter) is None:
missing_parameter = True
if missing_parameter:
return HttpResponse(status=400)
def _get_parameters_required(view_func):
def _decorator(request, *args, **kwargs):
response = view_func(request, *args, **kwargs)
return response
return wraps(view_func)(_decorator)
return _get_parameters_required
这不起作用,因为我没有检查参数的请求对象。我有请求对象,我没有参数对象。
这个问题有没有内置的解决方案,或者我怎样才能以正确的方式编写这个装饰器?
答案 0 :(得分:1)
为什么不在Serializer
中确定这一点,而不是在他们的意图之后呢?
如果您使用的是基于功能的DRF视图: -
def get_parameters_required(parameters=None):
def _get_parameters_required(view_func):
def _decorator(request, *args, **kwargs):
missing_parameter = False
if parameters is not None:
for parameter in parameters:
if request.GET.get(parameter) is None:
missing_parameter = True
if missing_parameter:
return HttpResponse(status=400)
response = view_func(request, *args, **kwargs)
return response
return wraps(view_func)(_decorator)
return _get_parameters_required
在当前的实现中,您需要检查请求方法中的参数而不是外部。
答案 1 :(得分:1)
整个if
语句应该在嵌套的_decorator
函数中,您做可以访问该请求。如果missing_parameter为False,则只调用view_func()
。
也就是说,正如hspandher指出的那样,这应该由Serializer完成。