Search code examples
djangorestdjango-rest-frameworkdjango-rest-auth

Handle a request header in Django rest framework to get the secret key passed in the header and save it with User table?


I have a django backend for a mobile app.

I'm using django rest framework (django-rest-auth), but I'm still writing my own views and logic because the API endpoints are not model based.

The request sent to me has a secret key in the headers which is associated to individual devices registered. Along with it it has post data consisting of device id and other details.

Once I get that header using request.META how can Save it in User model(It'll update everytime user login), so later it can be used as a foreign key to getting all the details like user and associated device.

class CustomLoginView(LoginView):
   def get_response_serializer(self):

    if getattr(settings, 'REST_USE_JWT', False):
        response_serializer = JWTSerializer
    else:
        # print(self.request.data)
        response_serializer = serializers.TokenSerializer
        # response_serializer = {'data':response_serializer}
    return response_serializer
   def get_response(self):

    # raise APIException("There was a problem!")
    serializer_class = self.get_response_serializer()
    # print(serializer_class.data)
    try:
        if getattr(settings, 'REST_USE_JWT', False):
            data = {
                'user': self.user,
                'token': self.token
            }
            serializer = serializer_class(instance=data,
                                        context={'request': self.request})
        else:
            print("hello")
            serializer = serializer_class(instance=self.token,
                                        context={'request': self.request})
            print("BYE")
            print(serializer.data)
            # print(self.request.data)
            try:
                # print(serializer.data)
                if 'email' not in self.request.POST:
                    return Response({'data':'message'})

                return Response({'data':serializer.data,'status':1,'message':'Success'}, status=status.HTTP_200_OK)
            except ValidationError as exc:
                raise ValidationError({
                        'field_val1': exc.detail,
                    })
    except:
            print("in except")
            raise APIException("There was a problem!")


   def post(self, request, *args, **kwargs):
    self.request = request
    self.serializer = self.get_serializer(data=self.request.data,
                                          context={'request': request})
    print(self.request.data)

    if self.serializer.is_valid():
        print(request.META)
        self.login()
        return self.get_response()
    else:
        return Response({"data":[],"message":"Credentials are wrong",'status':0})

My User_Model

class User(AbstractUser):
"""User model."""

username = None
email = models.EmailField(_('email address'), unique=True)
mobile_token = models.CharField(max_length=20,blank=True)

USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []

objects = UserManager()

My UserManage()

class UserManager(BaseUserManager): """Define a model manager for User model with no username field."""

use_in_migrations = True

def _create_user(self, email, password, **extra_fields):
    """Create and save a User with the given email and password."""
    if not email:
        raise ValueError('The given email must be set')
    email = self.normalize_email(email)
    user = self.model(email=email, **extra_fields)
    user.set_password(password)
    user.save(using=self._db)
    return user

def create_user(self, email, password=None, **extra_fields):
    """Create and save a regular User with the given email and password."""
    extra_fields.setdefault('is_staff', False)
    extra_fields.setdefault('is_superuser', False)
    return self._create_user(email, password, **extra_fields)

def create_superuser(self, email, password, **extra_fields):
    """Create and save a SuperUser with the given email and password."""
    extra_fields.setdefault('is_staff', True)
    extra_fields.setdefault('is_superuser', True)

    if extra_fields.get('is_staff') is not True:
        raise ValueError('Superuser must have is_staff=True.')
    if extra_fields.get('is_superuser') is not True:
        raise ValueError('Superuser must have is_superuser=True.')

    return self._create_user(email, password, **extra_fields)

Solution

  • Define an instance method and use it wherever in your CustomLoginView as

    from rest_framework.exceptions import ValidationError
    
    
    class CustomLoginView(LoginView):
        def save_header(self):
            headr = self.request.META.get('HTTP_MYHEADER', None)
            if headr is None:
                raise ValidationError('"MYHEADER" is missing in headers"')
            current_user = self.user
            current_user.mobile_token = headr
            current_user.save()
    
        # your code



    UPDATE
    Change your view as below

    from rest_auth.views import LoginView
    from rest_framework.exceptions import ValidationError
    
    
    class CustomLoginView(LoginView):
        def save_header(self):
            headr = self.request.META.get('HTTP_MYHEADER', None)
            if headr is None:
                raise ValidationError('"MYHEADER" is missing in headers"')
            current_user = self.user
            current_user.mobile_token = headr
            current_user.save()
    
        def post(self, request, *args, **kwargs):
            response = super().post(request, *args, **kwargs)
            if response.status_code == 200:
                self.save_header()
            return response

    and your payload should be as

    {
        "email":"myemail@email.com",
        "password":"mypassword"
    }



    Screenshots
    1. How to add HEADER Headers in POSTMAN

    2. How to send data in POSTMAN JSON Payload