namwoo
namwoo

Reputation: 89

Why does context={'request': self.request} need in serializer?

Today I dig into django-rest-auth package a bit. And I have no idea what context={'request': self.request} for in get_response and post function.

They say context parameter is for including extra context to serializer. But below the codes, it seems not necessary to put context parameter. Is there something I have missed?

context: http://www.django-rest-framework.org/api-guide/serializers/

django-rest-auth : https://github.com/Tivix/django-rest-auth/blob/master/rest_auth/views.py

def get_response(self):
    serializer_class = self.get_response_serializer()

    if getattr(settings, 'REST_USE_JWT', False):
        data = {
            'user': self.user,
            'token': self.token
        }
        serializer = serializer_class(instance=data,
                                      context={'request': self.request})
    else:
        serializer = serializer_class(instance=self.token,
                                      context={'request': self.request})

    return Response(serializer.data, status=status.HTTP_200_OK)

def post(self, request, *args, **kwargs):
    self.request = request
    self.serializer = self.get_serializer(data=self.request.data,
                                          context={'request': request})
    self.serializer.is_valid(raise_exception=True)

    self.login()
    return self.get_response()

Upvotes: 1

Views: 1033

Answers (1)

neverwalkaloner
neverwalkaloner

Reputation: 47364

Sometimes you need request's data inside serializer method. For this case you can provide request to serializer's context. For example if you look into PasswordResetSerializer you'll see in save method use_https option which calculated based on the request passed with context argument:

def save(self):
    request = self.context.get('request')
    # Set some values to trigger the send_email method.
    opts = {
        'use_https': request.is_secure(),
        'from_email': getattr(settings, 'DEFAULT_FROM_EMAIL'),
        'request': request,
    }

Also you can check if user is authenticated or not and depends on it return one data or another on serializer level.

Upvotes: 3

Related Questions