Необходимо получить пользовательский JSON-ответ для страницы авторизации входа и регистрации в django

viewset

class CustomRenderer(JSONRenderer):

    def render(self, data, accepted_media_type=None, renderer_context=None):
        status_code = renderer_context['response'].status_code
        response = {
          "status": "success",
          "code": status_code,
          "data": data,
          "message": None
        }

        if not str(status_code).startswith('2'):
            response["status"] = "error"
            response["data"] = None
            try:
                response["message"] = data["detail"]
            except KeyError:
                response["data"] = data

        return super(CustomRenderer, self).render(response, accepted_media_type, renderer_context)
        
class UserViewset(viewsets.ModelViewSet):
    renderer_classes = (CustomRenderer, ) 
    authentication_classes =[JWTAuthentication]            #ModelViewSet Provides the list, create, retrieve, update, destroy actions.
    permission_classes=(permissions.IsAdminUser,)    #admin authentication
    ##permission_classes = [HasValidJWT]
    queryset=models.Default_User.objects.all()
    serializer_class=serializers.UserDetailsSerializer

Urls.py

urlpatterns = [
    path('', TemplateView.as_view(template_name="social_app/index.html")), #social_app/index.html
    path('admin/', admin.site.urls),         #admin api
    path('api/',include(router.urls)),          #api
    path('accounts/', include('allauth.urls')),       #allauth
    re_path('rest-auth/', include('rest_auth.urls')),    #rest_auth
    path('api-auth/', include('rest_framework.urls')),
    re_path('/registration/', include('rest_auth.registration.urls')),
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    #path('auth/login/',TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    path('jobview/',view),
    path('timelog/',timelogview),
    path('chaining/', include('smart_selects.urls')),

]

Я создал пользовательский JSON-ответ для своего API и указал этот JSON-рендерер во всех моих наборах представлений API, и я получаю результаты, как ожидалось. Но мне нужно получить то же самое, когда я генерирую токен с помощью JWT на странице входа в систему.

Если я ввожу имя пользователя и пароль и размещаю это в url:http://127.0.0.1:8000/api/token/, я получаю результат в виде

{
    "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTY0OTQ4NjU0MSwiaWF0IjoxNjQ2ODk0NTQxLCJqdGkiOiI2ZWViYWRhZGY2YTU0M2ZkOTczYTQ5Y2RjNWM4OTdkZSIsInVzZXJfaWQiOj",
    "access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjQ2ODk1NDQxLCJpYXQiOjE2NDY4OTQ1NDEsImp0aSI6ImZkMDA5OWRkNTA4NzQyNDk5MTg0MTUxYzU3MWRjYmU1IiwidXNlcl9pZCI6M"
}

Но мне нужно получить его как

{
    "status": "success",
    "code": 200,
    "data": [
    "refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTY0OTQ4NjU0MSwiaWF0IjoxNjQ2ODk0NTQxLCJqdGkiOiI2ZWViYWRhZGY2YTU0M2ZkOTczYTQ5Y2RjNWM4OTdkZSIsInVzZXJfaWQiOjF9.Rn8trTwVSTt29dMhFSAGZOoi7B758MQHwL1LJjSj_xo",
    "access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjQ2ODk1NDQxLCJpYXQiOjE2NDY4OTQ1NDEsImp0aSI6ImZkMDA5OWRkNTA4NzQyNDk5MTg0MTUxYzU3MWRjYmU1IiwidXNlcl9pZCI6MX0.oQ4pHWMGXV_T1KBzXWZzvg2ceRuNUd5ci7-iZdevvB8"
]
 "message": null
}

То же самое происходит и с регистрацией аутентификации, она не работает для страниц аутентификации. Пожалуйста, помогите мне исправить это, так как я новичок в django.

Вам следует создать специальный сериализатор (не Renderer), который наследуется от TokenObtainPairSerializer для обработки вашего формата json, а затем создать новое представление, которое наследуется от представления TokenObtainPairView, его serializer_class установлен на ранее созданный сериализатор, и использовать его в вашем маршрутизаторе (не по умолчанию).

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer из rest_framework_simplejwt.views import TokenObtainPairView

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
    @classmethod
    def get_token(cls, user):
        token = super().get_token(user)

        # Add custom claims
        token['name'] = user.name
        # ...

        return token

class MyTokenObtainPairView(TokenObtainPairView):
    serializer_class = MyTokenObtainPairSerializer

ref: https://django-rest-framework-simplejwt.readthedocs.io/en/latest/customizing_token_claims.html

Если вы действительно хотите использовать рендерер, вы можете просто использовать обработчик клиента в атрибуте renderer_class вашего пользовательского представления.

Вернуться на верх