【问题标题】:What Happens When Django-Rest-Framework Receives a Request?当 Django-Rest-Framework 收到请求时会发生什么?
【发布时间】:2018-12-31 19:53:23
【问题描述】:

我试图了解 DRF 的工作原理,特别是 GenericViewSet 视图。

检索请求时的事件顺序是什么? 哪个组件接收请求? 请求传递到哪里? 何时进行验证?

上下文:我所有的字段选择枚举都是小写的,所以我试图小写所有到达的值(来自不受控制的第 3 方)。在调用任何公开的 GenericViewSet 方法之前,Django 的模型验证失败。如何在模型验证之前处理请求数据?

谁能解释一下这个话题?

【问题讨论】:

  • 我认为你应该使用调试器来查找问题,它可能需要很长时间:-)

标签: python django django-rest-framework


【解决方案1】:

我建议覆盖您尝试调试的方法。

然后您可以设置断点来探索当前范围。 pdb 等内置模块非常适合此功能!这是使用rest_framework.generics.CreateAPIView 的示例。请注意,您可以在跟踪中使用 request.data 访问发布数据。

from rest_framework.generics import CreateAPIView
import pdb;
...
class ExampleCreateView(CreateAPIView):

    def create(self, request, *args, **kwargs):
        pdb.set_trace()
        return super(ExampleCreateView, self).create(request, *args, **kwargs)

【讨论】:

  • 谢谢,但调试方法是我想要找到的。我知道我可以这样做,但 request.data 仅在模型验证发生后才会收到。它发生在哪里?
  • 对序列化的模型验证发生在模型序列化程序类中 rest_framework.serializers.Serializer 的 is_valid 方法中(假设您使用的是 rest_framework 序列化程序)。据我了解,request.data 应该是 JSON,并且仅在调用超类 rest_framwork.generics.CreateAPIView.create 方法之后才被验证并序列化为模型的实例。您说“仅在模型验证发生后才收到request.data”您能解释一下您的意思吗?
  • 感谢您的回复!我的意思是在调用rest_framwork.generics.CreateAPIView.create 之前已经返回了HTTP“无效请求”响应,因此在此之前必须在其他地方调用is_valid。我试图修改 request.data 以通过 create 内部的验证,但由于我刚才解释的原因,它没有用。
  • 您收到的 HTTP“无效请求”很可能不是来自序列化程序 is_valid 方法。我建议检查(或系统地禁用您的视图)权限、身份验证、CORS 或其他第三方中间件模块。或者,如果您仍然认为问题源于 is_valid 方法并且您希望覆盖任何和所有序列化,请尝试使用 rest_framework.views.APIView 类而不是泛型。
猜你喜欢
  • 2014-08-26
  • 2021-12-15
  • 2012-12-27
  • 2012-06-24
  • 1970-01-01
  • 2017-03-24
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多