How to customize in django-rest_framework-knox LoginView

2.1k Views Asked by At

hi i am trying to create login api which will give me extra output fields by default knox login is giving 'expire' and 'token' but i want to add other values too for example it is giving me :

{
"expiry": "2020-10-02T17:00:22.906891Z",
    "token": "2a6d73cf85f3f15d855ab0386db7fcf4342167ab3d47e1d0983a775c120ff267",
} ```
but i want to extra values too like :
{
"expiry": "2020-10-02T17:00:22.906891Z",
    "token": "2a6d73cf85f3f15d855ab0386db7fcf4342167ab3d47e1d0983a775c120ff267",
"username" : "foo",
"projects" :"["faa","fee","fuu"]",
}

my views.py is given below

from django.shortcuts import render
from .models import *
from django.views.generic.edit import FormView
from rest_framework import generics, permissions
from rest_framework.response import Response
from knox.models import AuthToken
from .serializers import UserSerializer, RegisterSerializer
from django.contrib.auth import login

from rest_framework import permissions
from rest_framework.authtoken.serializers import AuthTokenSerializer
from knox.views import LoginView as KnoxLoginView

# Register API
class RegisterAPI(generics.GenericAPIView):
    serializer_class = RegisterSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.save()
        return Response({
        "user": UserSerializer(user, context=self.get_serializer_context()).data,
        "token": AuthToken.objects.create(user)[1]
        })

class LoginAPI(KnoxLoginView):
    permission_classes = (permissions.AllowAny,)
    def get_post_response_data(self, request):
        data
    def post(self, request, format=None):
        serializer = AuthTokenSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        user_id_main=user.id
        user_name=user.username
        
        # projects_list=ProjectTable.objects.filter(id=Project_user_reletional_table.objects.filter(id=user_id))
        # for a in projects_list:
        #     print(a.name)
        #     print(a.project_city)
        print(user_id_main,user_name)
        b=Project_user_reletional_table.objects.filter(user_id_id=user_id_main)
        for a in b:
            print(a.project_id)
        login(request, user)
        login_details=super(LoginAPI, self).post(request, format=None)
        
        return super(LoginAPI, self).post(request, format=None)
        

please help me thanks in advance

2

There are 2 best solutions below

1
On

thanks but it is solved

class LoginAPI(KnoxLoginView):
    permission_classes = (permissions.AllowAny,)
  
    def post(self, request, format=None):
        serializer = AuthTokenSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        user_id_main=user.id
        user_name=user.username
        
        # projects_list=ProjectTable.objects.filter(id=Project_user_reletional_table.objects.filter(id=user_id))
        # for a in projects_list:
        #     print(a.name)
        #     print(a.project_city)
        print(user_id_main,user_name)
        print(" ________________________________________________________________________________________________________________________________________________________")
        projects=Project_user_reletional_table.objects.filter(user_id_id=user_id_main).values('project_id_id')
        print(projects)
        project_names=[ProjectTable.objects.filter(id=a['project_id_id']).values('name','project_city','project_code') for a in projects]
        login(request, user)
        temp_list=super(LoginAPI, self).post(request, format=None)
        # print([a for a in projects])
        temp_list.data["project_list"]=project_names
        # print(temp_list.data)

        return Response({"data":temp_list.data})

in this code i put super(LoginAPi,self).post(request,format=None) into a variable temp_list and by default it is returning Response then i go in Response class and check there is data attribute hold data in dict format . now i can add other value in that ,i don't know it is good approch or not but for me it is working good . maybe some day i got proper solution thanks

2
On

create a serializer.py in your app and serialized the User information you want to return so in your serializer.py will look something like this

from django.contrib.auth.models import User
from rest_framework import serializers, validators


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ("username", "password", "email", "first_name", "last_name")

Then, go to your settings and overwrite the rest knox default settings for user like this

REST_KNOX = {
    'USER_SERIALIZER': 'appName.serializers.UserSerializer'
}