Как мне реализовать формы для ввода пользователя для регистрации и входа в 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 и передать токен в заголовках, и вы можете проверить авторизацию