Необходимо получить пользовательский 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 вашего пользовательского представления.