如何更改 Django 身份验证登录的响应格式 api

How to change response format of Django auth login api

我目前正在使用 Django-rest-framework-social-oauth2 并且它是登录令牌创建端点,成功后会返回以下数据:

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

但我想更改格式并将数据包装成该格式:

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

我阅读了 Django 文档并尝试扩展库视图,但未显示任何更改

from rest_framework_social_oauth2.views import TokenView 

    @api_view(('POST'))
    def post(self, request, *args, **kwargs):
        # Use the rest framework `.data` to fake the post body of the django request.
        request._request.POST = request._request.POST.copy()
        for key, value in request.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

我建议创建一个 class based view and extend DRF-social-oauth2's TokenView,它有一个方法 post 来创建令牌:

  1. views.py:

    from rest_framework_social_oauth2.views import TokenView
    
    class MyTokenView(TokenView):
    
        def post(self, request, *args, **kwargs):
            response = super(MyTokenView, self).post(request, *args, **kwargs)
            return Response({
                'status': Your_Status,
                'data': response.data,
            }, status=response.status_code)
    

    .super 方法将创建所需的令牌,然后您可以如图所示操作给出的响应(如果需要,还可以使用多种其他方式!)。

  2. 您还需要在 urls.py 中添加一个 url 端点以进行身份​​验证:

    from my_project/my_app import MyTokenView
    
    urlpatterns = [
        ...
        url(
            r'^my_api/authenticate/$', 
            MyTokenView.as_view(), 
            name='authenticate'),
        ...
    ]
    

请记住: 由于您正在扩展 TokenView class 您应该处理 失败响应 还有。