Переопределите представление третьей стороны для конечной точки

#python #django #django-rest-framework

Вопрос:

Я использую Django-rest-framework-social-oauth2 , convert-token конечная точка. Эти конечные точки возвращают json следующим образом

 {
  "access_token": "************",
  "token_type": "Bearer",
  "expires_in": 36000,
  "refresh_token": "************",
  "scope": "read write"
}
 

Теперь я хочу добавить user id или удалить user model (например ,имя, адрес электронной почты и т. Д.) В этот json.

Поэтому я хочу переопределить это представление,возможно class ConvertTokenView , в этом коде.

Как я могу это сделать??

 class ConvertTokenView(CsrfExemptMixin, OAuthLibMixin, APIView):
    """
    Implements an endpoint to convert a provider token to an access token
    The endpoint is used in the following flows:
    * Authorization code
    * Client credentials
    """
    server_class = SocialTokenServer
    validator_class = oauth2_settings.OAUTH2_VALIDATOR_CLASS
    oauthlib_backend_class = KeepRequestCore
    permission_classes = (permissions.AllowAny,)

    def post(self, request, *args, **kwargs):
        # Use the rest framework `.data` to fake the post body of the django request.
        mutable_data = request.data.copy()
        request._request.POST = request._request.POST.copy()
        for key, value in mutable_data.items():
            request._request.POST[key] = value

        url, headers, body, status = self.create_token_response(request._request)
        response = Response(data=json.loads(body), status=status)

        for k, v in headers.items():
            response[k] = v
        return response
 

Комментарии:

1. вы хотите просто изменить ответ ?

2. Вы можете немного изменить словарь тела и добавить в него новые поля, прежде чем передавать его в Response

Ответ №1:

Вы должны сделать два шага:

Шаг 1. Переопределите ConvertTokenView представление, чтобы включить нужные поля как таковые:

 class MyCustumConvertTokenView(CsrfExemptMixin, OAuthLibMixin, APIView):
    """
    Implements an endpoint to convert a provider token to an access token
    The endpoint is used in the following flows:
    * Authorization code
    * Client credentials
    """
    server_class = SocialTokenServer
    validator_class = oauth2_settings.OAUTH2_VALIDATOR_CLASS
    oauthlib_backend_class = KeepRequestCore
    permission_classes = (permissions.AllowAny,)

    def post(self, request, *args, **kwargs):
        # Use the rest framework `.data` to fake the post body of the django request.
        mutable_data = request.data.copy()
        request._request.POST = request._request.POST.copy()
        for key, value in mutable_data.items():
            request._request.POST[key] = value

        url, headers, body, status = self.create_token_response(request._request)

        # You can add your desired fields here:
        data=json.loads(body)
        data['username'] = request.user.username 
        response = Response(data, status=status)

        for k, v in headers.items():
            response[k] = v
        return response
 

Шаг 2: Измените свою urlconf convert-token конечную точку, чтобы она указывала на ваше новое представление

     url(r'^convert-token/?

Примечание 1: В вашем  views.py  случае , когда вы переписываете это ConvertTokenView  , вы должны импортировать все необходимые модули из исходного пакета.

Примечание 2.  urlsconf  Убедитесь, что этот недавно добавленный URL-адрес находится поверх URL-адреса, связанного с пакетом oauth2.


Комментарии:

1. Спасибо, это довольно отличное объяснение. Я подумал, что мне следует заняться наследством. но мне просто нужно сделать чередование.

, MyCustumConvertTokenView.as_view(), name="convert_token"),
Примечание 1: В вашем views.py случае , когда вы переписываете это ConvertTokenView , вы должны импортировать все необходимые модули из исходного пакета.

Примечание 2. urlsconf Убедитесь, что этот недавно добавленный URL-адрес находится поверх URL-адреса, связанного с пакетом oauth2.

Комментарии:

1. Спасибо, это довольно отличное объяснение. Я подумал, что мне следует заняться наследством. но мне просто нужно сделать чередование.