当我尝试通过前端注册新用户时,它不会自动登录我,它告诉我这些新用户的电子邮件已经存在。从我在Django Admin中看到的,用户确实被保存/注册了,我可以用他们登录。然而,我得到这些错误,并且新用户在创建后没有立即登录,这让我很烦恼。这是我第一个使用Django和Redux的项目,因此任何帮助都将非常感谢。
Registration Error:
{detail: "User with this email already exists"}
detail:
"User with this email already exists"
这是我在网络选项卡上得到的错误。
Console Errors: POST http://localhost:3000/api/users/register/400(Bad Request)
控制台上出现的错误
Login Errors
使用现有用户登录时出现的错误。我不知道这是否会影响功能,但我的首要任务是解决注册问题。
RegisterPage.js
import React, { useEffect, useState } from "react";
import { Link, useLocation, useNavigate } from "react-router-dom";
import { Form, Button, Row, Col } from "react-bootstrap";
import { useDispatch, useSelector } from "react-redux";
import Loading from "../components/Loading";
import ErrorMessage from "../components/Error";
import FormContainer from "../components/FormContainer";
import { login, register } from "../actions/userActions";
function RegisterPage() {
const [name, setName] = useState("");
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [confirmPassword, setConfirmPassword] = useState("");
const [errorMessage, setErrorMessage] = useState("");
const location = useLocation();
const navigate = useNavigate();
const dispatch = useDispatch();
const redirect = location.state ? Number(location.state) : "/";
const userRegister = useSelector((state) => state.userRegister);
const { error, loading, userInfo } = userRegister;
const submitHandler = (e) => {
e.preventDefault();
if (password != confirmPassword) {
setErrorMessage("Passwords do not match");
} else {
dispatch(register(name, email, password));
}
};
useEffect(() => {
if (userInfo) {
navigate(redirect);
}
}, [navigate, userInfo, redirect]);
return (
<FormContainer>
<h1>Register</h1>
{loading && <Loading />}
<Form onSubmit={submitHandler}>
<Form.Group controlId="name">
<Form.Label>Name</Form.Label>
<Form.Control
required
type="name"
placeholder="Enter name"
value={name}
onChange={(e) => setName(e.target.value)}
></Form.Control>
</Form.Group>
<Form.Group controlId="email">
<Form.Label>Email Address</Form.Label>
<Form.Control
required
type="email"
placeholder="Enter Email"
value={email}
onChange={(e) => setEmail(e.target.value)}
></Form.Control>
</Form.Group>
<Form.Group controlId="password">
<Form.Label>Password</Form.Label>
<Form.Control
required
type="password"
placeholder="Enter Password"
value={password}
onChange={(e) => setPassword(e.target.value)}
></Form.Control>
</Form.Group>
<Form.Group controlId="passwordConfirm">
<Form.Label>Confirm Password</Form.Label>
<Form.Control
required
type="password"
placeholder="Confirm Password"
value={confirmPassword}
onChange={(e) => setConfirmPassword(e.target.value)}
></Form.Control>
</Form.Group>
<Button variant="primary" type="submit">
Register
</Button>
</Form>
<Row className="py-3">
<Col>
Already have an account?
<Link to={redirect ? `/login?redirect=${redirect}` : "/login"}>
Sign In
</Link>
</Col>
</Row>
</FormContainer>
);
}
export default RegisterPage;
userActions.js
import {
USER_LOGIN_REQUEST,
USER_LOGIN_SUCCESS,
USER_LOGIN_FAIL,
USER_LOGOUT,
USER_REGISTER_REQUEST,
USER_REGISTER_SUCCESS,
USER_REGISTER_FAIL,
} from "../constants/userConstants";
export const userLoginReducer = (state = {}, action) => {
switch (action.type) {
case USER_LOGIN_REQUEST:
return { loading: true };
case USER_LOGIN_SUCCESS:
return {
loading: false,
userInfo: action.payload,
};
case USER_LOGIN_FAIL:
return { loading: false, error: action.payload };
case USER_LOGOUT:
return {};
default:
return state;
}
};
export const userRegisterReducer = (state = {}, action) => {
switch (action.type) {
case USER_REGISTER_REQUEST:
return { loading: true };
case USER_REGISTER_SUCCESS:
return {
loading: false,
userInfo: action.payload,
};
case USER_REGISTER_FAIL:
return { loading: false, error: action.payload };
case USER_LOGOUT:
return {};
default:
return state;
}
};
userReducers.js
import {
USER_LOGIN_REQUEST,
USER_LOGIN_SUCCESS,
USER_LOGIN_FAIL,
USER_LOGOUT,
USER_REGISTER_REQUEST,
USER_REGISTER_SUCCESS,
USER_REGISTER_FAIL,
} from "../constants/userConstants";
export const userLoginReducer = (state = {}, action) => {
switch (action.type) {
case USER_LOGIN_REQUEST:
return { loading: true };
case USER_LOGIN_SUCCESS:
return {
loading: false,
userInfo: action.payload,
};
case USER_LOGIN_FAIL:
return { loading: false, error: action.payload };
case USER_LOGOUT:
return {};
default:
return state;
}
};
export const userRegisterReducer = (state = {}, action) => {
switch (action.type) {
case USER_REGISTER_REQUEST:
return { loading: true };
case USER_REGISTER_SUCCESS:
return {
loading: false,
userInfo: action.payload,
};
case USER_REGISTER_FAIL:
return { loading: false, error: action.payload };
case USER_LOGOUT:
return {};
default:
return state;
}
};
用户视图.py
from django.shortcuts import render
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated, IsAdminUser
from rest_framework.response import Response
from django.contrib.auth.models import User
from base.serializers import ProductSerializer, UserSerializer, UserSerializerWithToken
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView
from django.contrib.auth.hashers import make_password
from rest_framework import status
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
def validate(self, attrs):
data = super().validate(attrs)
serializer = UserSerializerWithToken(self.user).data
for i, j in serializer.items():
data[i] = j
return data
class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer
@api_view(['POST'])
def registerUser(request):
data = request.data
try:
user = User.objects.create(
first_name=data['name'],
username=data['email'],
email=data['email'],
password=make_password(data['password'])
)
serializer = UserSerializerWithToken(user, many=False)
return Response(serializer.data)
except:
message = {'detail': 'User with this email already exists'}
return Response(message, status=status.HTTP_400_BAD_REQUEST)
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def getUserProfile(request):
user = request.user
serializer = UserSerializer(user, many=False)
return Response(serializer.data)
@api_view(['GET'])
@permission_classes([IsAdminUser])
def getUsers(request):
users = User.objects.all()
serializer = UserSerializer(users, many=True)
return Response(serializer.data)
serializers.py
from rest_framework import serializers
from django.contrib.auth.models import User
from rest_framework_simplejwt.tokens import RefreshToken
from .models import Product
class UserSerializer(serializers.ModelSerializer):
name = serializers.SerializerMethodField(read_only=True)
_id = serializers.SerializerMethodField(read_only=True)
class Meta:
model = User
fields = ['id', '_id', 'username', 'email', 'name', 'isAdmin']
def get__id(self, obj):
return obj.id
def get_isAdmin(self, obj):
return obj.is_staff
def get_name(self, obj):
name = obj.first_name
if name == '':
name = obj.email
return name
class UserSerializerWithToken(UserSerializer):
token = serializers.SerializerMethodField(read_only=True)
class Meta:
model = User
fields = ['id', '_id', 'username', 'email', 'name', 'isAdmin']
def get_token(self, obj):
token = RefreshToken.for_user(obj)
return str(token.access_token)
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = '__all__'
github仓库:https://github.com/ngc918/dr-ecommerce
应该公开
1条答案
按热度按时间vi4fp9gy1#
创建用户时没有问题,这表明问题在以下几行中。
尝试打印序列化程序的内容,以找出可能的错误。
我不是Django的Maven,但觉得下面的内容需要再看一遍。
在UserSerializerWithToken中,您有
我假设这些是User对象上的字段。
在register函数中,您将创建一个具有“first_name”属性的User对象。如果first_name是对象上存在的属性,则您试图在UserSerializerWithToken中获取错误的字段“name”。
此外,检查您是否应该调用“RefreshToken”,因为如果用户是第一次注册,您将没有令牌。您可能应该在注册期间调用“AccessToken”。
希望这能帮上忙。