【问题标题】:'WSGIRequest' object has no attribute 'data'“WSGIRequest”对象没有属性“数据”
【发布时间】:2015-02-01 23:14:13
【问题描述】:

我在发布到我的 API 时遇到问题,并且无法完全弄清楚错误指的是什么。如果重要的话,我正在使用 Django REST 并包含回溯。

if (repeat == false) {
    post_data = {'User': usernameInput}
    $.ajax({
        type: 'POST',
        url: '/0/addUser',
        data: post_data,
        async: true
    })
}

class AddUser(APIView):
    def post(self, request, format = None):
        serializer = UserSerializer(data=request.data)
        if serializer.isvalid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)


Traceback:
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Library/Python/2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view
  57.         return view_func(*args, **kwargs)
File "/Library/Python/2.7/site-packages/django/views/generic/base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/rest_framework/views.py" in dispatch
  403.             response = self.handle_exception(exc)
File "/Library/Python/2.7/site-packages/rest_framework/views.py" in dispatch
  400.             response = handler(request, *args, **kwargs)
File "/Users/rae/Desktop/112/djangotemplate/notes/views.py" in post
  23.       serializer = UserSerializer(data=request.data)
File "/Library/Python/2.7/site-packages/rest_framework/request.py" in __getattr__
  436.         return getattr(self._request, attr)

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    Django REST Framework 有自己的Request 对象,它包装了Django 传入的HttpRequest 对象并添加了一些额外的功能(如自定义呈现和另一个身份验证层)。如果访问Request 对象上不存在的任何属性,它会自动将其代理到底层HttpRequest,因此通常您不会注意到差异。

    在 DRF 2.x 中,Request 属性具有 DATAFILES 属性,用于存储传入的数据以及已检测到的任何文件。这些在 DRF 3.0 中合并并替换为单个 data 属性。随着 DRF 3.0 的发布,所有文档现在都反映了新的 Request.data 属性。

    您似乎正在使用 Django REST Framework 2.x,但您正在尝试访问 DRF 3.0 中引入的新属性。因为它在Request 对象上不存在,所以它被代理到HttpRequest 对象,在那里也找不到它。

    【讨论】:

    • 我使用的是 3.0.4 并且遇到了同样的错误。我正在使用中间件来存储调试请求,并在 process_response 中尝试调用 request.data 给我 no attribute 'data' 错误。想法?
    • 我正在使用 DRF 3.5.3 和 djangorestframework-jwt 1.9.0 并且也看到了这个错误。有什么想法吗?
    • 显然这个答案对于现代 Django 版本是不正确的
    【解决方案2】:

    如果您在使用视图方法时遇到此问题,那么您可以尝试使用 @api_view 装饰器

    from rest_framework.decorators import api_view
    
    @api_view(["POST"])
    def Function(request, <other-stuff>):
        # do the thing
    

    【讨论】:

      【解决方案3】:

      序列化器需要一个drf请求,但是你的请求是django提供的WSGIRequest。

      我使用以下函数来检索请求。

      from django.http import HttpRequest
      from rest_framework.request import Request
      
      def preprocess_request(request):
          if isinstance(request, HttpRequest):
              return Request(request, parsers=[FormParser])
          return request
      

      您可能希望使用单独的解析器或提供多个。我的问题略有不同,只需要 FormParser!

      【讨论】:

      • context_parser 和其他必需参数丢失并产生问题。 like request = parser_context['request'] KeyError: 'request'
      猜你喜欢
      • 2016-07-30
      • 2017-02-02
      • 2015-04-15
      • 2013-05-20
      • 2016-09-22
      • 2015-10-19
      • 2021-11-16
      • 2012-07-31
      • 2021-12-26
      相关资源
      最近更新 更多