Django app将HTTP请求视为HttpRequest对象,而不是django-rest Request对象

时间:2016-01-09 17:19:36

标签: django rest http http-headers django-rest-framework

我有以下代码

 class UserPollPassedView(generics.UpdateAPIView):
      permission_classes = (permissions.IsAuthenticated,)
      serializer_class = UsersPollUpdateSerializer

 def update(self, request, *args, **kwargs):
      request.data['date_passed'] = datetime.datetime.now()
      request.data['passed'] = True
      return super(UserPollPassedView, self).update(request, *args, **kwargs)

当我尝试通过像hurl.it这样的卷曲工具访问此方法时,我得到QueryDict is immutable错误,因为我试图修改request.data的内容,假设请求是Django- rest的Request对象,但事实并非如此,它实际上是原生的Django HttpRequest对象。当我在请求标头中明确定义Content-type: application\json时,它会给我另一个JSON parse error。当我使用httpie工具时,一切都顺利和干净,但默认情况下它会发送相同的application\json标头。我想,差异仍在标题中,但我无法理解究竟应该改变什么。

我还尝试通过在访问request之前添加以下行来明确地从HttpRequestRequest进行类型转换request.data

request = self.initialize_request(request)

但没有用,即使"JSON parse error - Expecting value: line 1 column 1 (char 0)"最初是来自httpie的request对象,它也会提供相同的Request

欣赏任何线索

2 个答案:

答案 0 :(得分:0)

我不知道为什么你认为该对象不是DRF请求。由于您使用的是DRF视图,因此会收到DRF请求。 Django自己的请求对象甚至没有data属性。

答案 1 :(得分:0)

request变量肯定持有DRF Request对象,而不是Django HttpRequest对象。如果不是这种情况,您会收到dataHttpRequest不存在的错误。

问题是当数据作为表单数据(例如通过浏览器)提交时,request.dataQueryDict object,这应该接近于从request.POST /获得的数据request.GET / request.FILES。这可能是您认为它是Django HttpRequest的原因,因为这通常是人们在尝试修改这些对象后看到的问题。

您正在尝试修改不推荐的request.data,并且应该将其视为不可变字典。通常,这表示您应该在其他位置设置这些密钥,通常在序列化程序层上或通过覆盖perform_update作为挂钩),而不是修改传入的请求数据。