Как мне реализовать формы для ввода пользователя для регистрации и входа в Django, если у меня уже есть представления, использующие JWT?

Я учусь работать с JWT (pyJWT) в Django, в данном случае я пытаюсь аутентифицировать пользователей с его помощью, я следовал учебнику и с помощью postman все получилось, я использую mysql, пароли были хэшированы и токены были сгенерированы успешно, теперь осталось создать формы, чтобы пользователь мог ввести свои учетные данные, но я не знаю, как это сделать.

Views.py

class RegisterView(APIView):
    def post(self, request):
        serializer = UserSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data)
    
class LoginView(APIView):
    def post(self, request):
        email = request.data['email']
        password = request.data['password']

        user = User.objects.filter(email=email).first()

        if user is None:
            raise AuthenticationFailed('User not found')

        if not user.check_password(password):
            raise AuthenticationFailed('Incorrect password')

        payload = {
            'id': user.id,
            'exp': datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(minutes=60),
            'iat': datetime.datetime.now(datetime.timezone.utc)


        }

        token = jwt.encode(payload, 'secret', algorithm='HS256')

        
        response = Response()

        response.set_cookie(key='jwt', value=token, httponly=True)
        response.data = {"jwt": token

        }

        return response
    

class UserView(APIView):

    def get(self, request):
        token = request.COOKIES.get('jwt')

        if not token:
            raise AuthenticationFailed('Unathenticated!')
        try:
            payload = jwt.decode(token, 'secret', algorithms=['HS256'])
        except jwt.ExpiredSignatureError:
            raise AuthenticationFailed('Uathenticated')
        
        user = User.objects.filter(id=payload['id']).first()
        serializer = UserSerializer(user)

        return Response(serializer.data)
    

class LogoutView(APIView):
    def post(self, request):
        response = Response()
        response.delete_cookie('jwt')
        response.data = {
            'message': 'Success'

        }
        return response
    

Serializers.py


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'email', 'password', 'first_name', 'last_name', 'username']
        extra_kwargs = {
            'password': {'write_only': True}
        }

    def create(self, validated_data):
        password = validated_data.pop('password', None)
        instance = self.Meta.model(**validated_data)
        if password is not None:
            instance.set_password(password)
        instance.save()
        return instance

Models.py

class User(AbstractUser):
    
    email = models.CharField(max_length=255, unique=True)
    password = models.CharField(max_length=255)
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    username = models.CharField(max_length=255)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

Вы можете соединить DRF с Django Template, создать другое приложение для Django Template, как вы работаете в Django. Затем вы можете получить api с помощью jquery.

Также можно использовать приведенный ниже метод, но я не рекомендую использовать этот метод, всегда старайтесь использовать jquery. https://github.com/sumasreeeduru/Textyfi

Note: Используйте DRF для бэкенда, попробуйте интегрировать фронтенд с React, NextJS или любой другой JS библиотекой, которую обычно используют все.

во-первых, импортируйте ваши представления в файл urls.py, который вы создаете в своем приложении, и вы можете протестировать его в postman, получить с помощью вашего api и передать токен в заголовках, и вы можете проверить авторизацию

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