chrae
chrae

Reputation: 131

'WSGIRequest' object has no attribute 'data'

I'm having trouble with posting to my API and can't quite figure out what the error is referring to. If it matters, I'm using Django REST and included the traceback.

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)

Error showing for this code:

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)

Upvotes: 10

Views: 27973

Answers (3)

Sanfer
Sanfer

Reputation: 413

If you're experiencing this issue with a view method then you could try using the @api_view decorator

from rest_framework.decorators import api_view

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

Upvotes: 10

Pinna_be
Pinna_be

Reputation: 4617

Serializers need a drf request, but the request you have is a WSGIRequest provided by django.

I use the following function to retrieve the request.

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

You might want to use a separate parser or provide multiple. My issue was slightly different and only requires FormParser!

Upvotes: 0

Kevin Brown-Silva
Kevin Brown-Silva

Reputation: 41671

Django REST Framework has its own Request object that wraps the HttpRequest object passed in by Django and adds some additional functionality (like custom rendering and another authentication layer). If any properties are accessed on the Request object that don't exist, it will automatically proxy it to the underlying HttpRequest, so typically you don't notice the difference.

In DRF 2.x, the Request property has DATA and FILES properties that store the passed in data as well as any files which have been detected. These were combined in DRF 3.0 and replaced with a single data property. As DRF 3.0 has been released, all of the documentation now reflects the new Request.data property.

You appear to be using Django REST Framework 2.x, but you are trying to access the new property introduced in DRF 3.0. Because it doesn't exist on the Request object, it is being proxied down to the HttpRequest object, where it also isn't being found.

Upvotes: 13

Related Questions