将请求对象和额外参数放入自定义装饰器

时间:2015-09-24 10:41:26

标签: python django django-rest-framework

我正在尝试编写自定义装饰器。我想检查是否随请求一起发送了所有必需的参数。我写了这样的话:

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

这不起作用,因为我没有检查参数的请求对象。我有请求对象,我没有参数对象。

这个问题有没有内置的解决方案,或者我怎样才能以正确的方式编写这个装饰器?

2 个答案:

答案 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完成。