def __call__(self, func):
if hasattr(func, '__params__'):
func.__params__.append(self)
return func
@wraps(func)
def _decorator(*args, **kwargs):
if len(args) < 1:
# Call function immediately, maybe raise an error is better.
return func(*args, **kwargs)
extra_kwargs = None
if isinstance(args[0], View):
request = args[0].request
# Update the kwargs from Django REST framework's APIView class
if isinstance(args[0], APIView):
extra_kwargs = args[0].kwargs
else:
# Find the first request object
for arg in args:
if isinstance(arg, (RestRequest, HttpRequest)):
request = arg
break
else:
request = args[0]
if request:
# Checkout all the params first.
for _param in _decorator.__params__:
_param._parse(request, kwargs, extra_kwargs)
# Validate after all the params has checked out, because some validators needs all the params.
for _param in _decorator.__params__:
for validator in _param.validators:
validator(_param.related_name, kwargs, _param.verbose_name)
return func(*args, **kwargs)
_decorator.__params__ = [self]
return _decorator
评论列表
文章目录