Django возвращает AnonymousUser, несмотря на предыдущую аутентификацию
У меня возникла проблема, когда я вызываю функцию login()
внутри Django и, несмотря на то, что идентификатор пользователя установлен в сессии запроса, всякий раз, когда в другом представлении я вызываю request.user.is_authenticated
, которая возвращает True
.
Мой вид логина:
class LoginView(APIView):
serializer_class = LoginUserSerializer
def post(self, request):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
username = serializer.data.get('username')
password = serializer.data.get('password')
# If username is not present in the database at all
user_exist_query = User.objects.filter(username=username)
if not user_exist_query.exists():
return JsonResponse({"error": "Username does not exist"}, status = 401)
# If username and password match
user_auth_query = authenticate(username=username, password=password)
if user_auth_query is not None:
login(request, user_auth_query)
return JsonResponse({"message": "Login Successful"}, status = 200)
else:
return JsonResponse({"error": "Username and Password combination is incorrect"}, status = 401)
return JsonResponse({"error": "Bad Request"}, status=400)
Другой вид, в котором аутентификация действительно работает:
class CheckAuthView(APIView):
def get(self, request):
if request.user.is_authenticated:
return Response(status=status.HTTP_200_OK)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)
Я использую это представление для защиты маршрута (использую React в качестве фронтенда). Домашняя страница доступна только для вошедших в систему пользователей, и всякий раз, когда я вхожу в систему, я могу просматривать эту страницу, а когда я выхожу, показывается другая страница, что доказывает, что здесь получение request.user
действительно возвращает реального пользователя.
Вид, где есть проблемы:
class CreateClubView(APIView):
serilizer_class = ClubSerializer
def post(self, request):
serializer = self.serilizer_class(data=request.data)
print(request.user.is_authenticated)
if serializer.is_valid():
clubName = serializer.data.get('name')
clubDesc = serializer.data.get('description')
clubLoc = serializer.data.get('location')
clubEmail = serializer.data.get('email')
clubContact = serializer.data.get('contact')
clubWebsite = serializer.data.get('website')
clubOrganizer = request.session['id']
queryset = Club.objects.filter(name=clubName)
if queryset.exists():
return Response(status=status.HTTP_400_BAD_REQUEST)
club = Club.objects.create(name=clubName, description=clubDesc, location=clubLoc,
email=clubEmail, contact=clubContact, website=clubWebsite, organizer=clubOrganizer)
club.save()
return Response(status=status.HTTP_201_CREATED)
return Response(status=status.HTTP_400_BAD_REQUEST)
Печать request.user
возвращает AnonymousUser
, а попытка доступа к request.session['id']
приводит к ошибке KeyError. Однако этого не должно быть, потому что если я вошел в систему раньше (что подтверждается ответом на вызов API для входа и тем фактом, что я могу получить доступ к главной странице).
Кроме того, код React, в котором я делаю вызов API:
const response: Response = await fetch('http://127.0.0.1:8000/api/clubs/create', {
method: 'POST',
headers: headers,
body: JSON.stringify(form),
})
if (response.ok) {
console.log("Club created successfully");
navigate("/home");
} else {
console.log("Club creation failed");
}
Что не так с моим кодом? Я неправильно понимаю, как работают сессии Django? У меня есть другой Django-проект, где я делаю то же самое, и там все прекрасно работает.
Я также попробовал вручную установить id
перед вызовом login()
, выполнив request.session['id'] = User.objects.get(username=username).id
- это тоже не помогло.
Я видел несколько решений, связанных с Django settings.py
, я не думаю, что я что-то упустил?
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
'corsheaders.middleware.CorsMiddleware',
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]
Исправлено, на самом деле это было связано с CORS и тем, как я вызывал свои конечные точки API. Идентификатор сессии не устанавливался после входа в систему, потому что я делал такие запросы:
http://localhost:8000/api/authentication/login
После изменения на просто:
/api/authentication/login
, проблема была устранена, и куки идентификатора сессии устанавливаются правильно.