所以我正在创建一个登录页面。我已经创建了模型以及视图和端点。登录时,我尝试使用 django 从后端获取数据来验证输入的登录凭据,但出现运行时错误
TypeError: Failed to fetch at HandleSubmit
我成功注册了我的用户,我已检查数据库以确保该用户存在
我的设置的基本概述。我有一个模型 LoginDetails,它已在 settings.py 中设置为 AUTH_USER_MODEL。
这是我的模型
class LoginDetails(AbstractUser):
user_data = models.OneToOneField(UserData, on_delete=models.CASCADE, null = True)
username = models.CharField(max_length=255, unique=True, null=True)
password = models.CharField(max_length=255, null=True) # Note: It's recommended to use hashed passwords in production
USERNAME_FIELD = 'username'
def __str__(self):
return self.username
这是我的login.js(仅发布相关信息)
`const handleSubmit = async (event) => {
event.preventDefault();
const response = await fetch('http://127.0.0.1:8000/api/login/', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
credentials: 'include',
body: JSON.stringify({
formData
})
});
const content = await response.json();
setRedirect(true);
props.setName(content.name);
};`
以及与我的端点 api/登录关联的视图。
编辑:我在下面的视图中添加了一条打印语句,只是为了看看它是否采用输入的用户名
在运行 django 服务器的 python 终端上,打印用户名时没有得到任何结果。
class LoginView(APIView):
def post(self, request):
username = request.data.get('username')
password = request.data.get('password')
print(username)
user = LoginDetails.objects.filter(username=username).first()
if user is None:
return Response({'error': 'Invalid username'}, status=status.HTTP_401_UNAUTHORIZED)
if not user.check_password(password):
return Response({'error': 'Invalid password'}, status=status.HTTP_401_UNAUTHORIZED)
print(user.user_data.role)
payload = {
'id': user.id,
'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=60),
'iat': datetime.datetime.utcnow()
}
token = jwt.encode(payload, 'secret', algorithm='HS256').decode('utf-8')
response = Response()
response.set_cookie(key='jwt', value=token, httponly=True)
response.data = {
'jwt': token
}
return response
这是我正在使用的序列化器
class LoginDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = LoginDetails
fields = '__all__'
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
尝试如下。
username = request.POST.get('your_form_field_name','default_value_if_form_value_is_not_present_in_the_form')
#or
username = request.POST.get('your_form_field_name')
default_value_if_form_value_is_not_present_in_the_form
不需要。所以以上两个都是正确的。