为什么context = {'request':self.request}需要在序列化器中?

时间:2018-02-19 07:14:46

标签: python django django-rest-framework

今天我深入研究了django-rest-auth软件包。我不知道context={'request': self.request}get_response函数中的post是什么。

他们说上下文参数用于包含序列化程序的额外上下文。但是在代码之下,似乎没有必要放置上下文参数。有没有我错过的东西?

上下文: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()

1 个答案:

答案 0 :(得分:3)

有时您需要在序列化方法中使用请求的数据。对于这种情况,您可以向序列化程序的上下文提供请求。例如,如果您查看PasswordResetSerializer,您会在save方法use_https中看到根据上下文参数传递的请求计算的选项:

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,
    }

此外,您可以检查用户是否经过身份验证,并依赖于它在序列化程序级别返回一个或另一个数据。