gpt4 book ai didi

python - DRF APIView 将请求验证移动到使用 request.data 的分派(dispatch)方法

转载 作者:太空狗 更新时间:2023-10-30 01:32:31 25 4
gpt4 key购买 nike

我创建了一个基本的 api View ,它从 APIView 扩展,我在其中记录响应时间、日志请求和其他常见内容。

现在,我还想在这里添加请求验证,使用子类 View 中定义的序列化程序。我认为合适的地方是将它放在 dispatch() 方法中。但是在我调用API.dispatch() 方法之前,request.data 还没有准备好。所以,那是行不通的。有人可以帮助我在正确的方向上如何将验证移到一个地方吗?

类结构如下:

class BaseView(APIView):
validation_serializer = None

def dispatch(self, request, *args, **kwargs):
# Some code here
# How to use `validation_serializer` here, to validate request data?
# `request.data` is not available here.
response = super(BaseView, self).dispatch(request, *args, **kwargs)
# Some code here
return response

class MyView(BaseView):
validation_serializer = ViewValidationSerializer

def post(self, request, *args, **kwargs):
pass

我认为另一种方法可以在 post() 方法的顶部使用装饰器。但如果有一种比在整个项目中放置装饰器更简洁的方法该多好?

注意:这类似于此处的问题:Django - DRF - dispatch method flow .但根据那里的建议,我不想从 DRF 源代码中复制整个 dispatch 方法。

最佳答案

将django请求处理成DRF请求(并添加request.data属性)的方法是APIView.initialize_request . APIView.dispatch() method calls it然后继续调用适当的方法处理程序 (post/patch/put)。

您可以通过调用它并使用返回的对象来尝试自己做:

class BaseView(APIView):
validation_serializer = None

def dispatch(self, request, *args, **kwargs):
request = self.initialize_request(request, *args, **kwargs)
kwargs['context'] = self.get_serializer_context()
serializer = self.validation_serializer(data=request.data, *args, **kwargs)

# use `raise_exception=True` to raise a ValidationError
serializer.is_valid(raise_exception=True)

response = super(BaseView, self).dispatch(request, *args, **kwargs)
return response

但是,我建议不要这样做,因为 dispatch() 的其他功能可能应该在处理验证之前执行;因此,您可以将上述逻辑移至相关的post/patch/put 方法。

在这些方法中,您也可以直接使用 self.request,因为它已经被 dispatch() 初始化。

关于python - DRF APIView 将请求验证移动到使用 request.data 的分派(dispatch)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40701749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com