Представление выхода из журнала Django не работает (без сетевого трафика)
Я изучаю Django, чтобы создать бэк-энд для своего сайта. Я делаю приложение аутентификации для проекта. Я тестирую его, используя отдельный html-файл вместо шаблона, так как в конечном итоге я хочу связать его с фронт-эндом. Вид входа в систему работает нормально, а вот выход из системы - нет. Он печатает на терминале сервера сообщение об успехе: "POST /members/logout_user/ HTTP/1.1" 200 10
но ничего не делает в браузере. Нет никакого сетевого трафика.
Просмотров:
from django.contrib.auth import authenticate, login, logout
from django.contrib import messages
from django.http import HttpResponse
from rest_framework.decorators import api_view
@api_view(['POST'])
def login_user(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return HttpResponse("Logged in")
else:
return HttpResponse("incorrect")
@api_view(['POST'])
def logout_user(request):
logout(request)
return HttpResponse("logged out")
Мой html-клиент:
<!DOCTYPE html>
<html>
<body>
<form method="POST" action="http://127.0.0.1:8000/members/login_user/">
User name: <input type="text" name="username" id="username" /> <br />
Password: <input type="password" name="password" id="password" />
<input type="submit" />
</form>
<button onclick="logout()">Log out</button>
<script>
function logout() {
csrf_cookieValue = document.cookie
.split(";")
.find((row) => row.startsWith("csrftoken"))
.split("=")[1];
let xhr = new XMLHttpRequest();
xhr.open("POST", "http://127.0.0.1:8000/members/logout_user/");
xhr.setRequestHeader("X-CSRFToken", "csrf_cookieValue");
xhr.send();
</script>
</body>
</html>
используйте вместо этого
@api_view(['POST'])
to
@api_view(['GET'])
Потому что вы не можете ввести данные для выхода из системы. Итак, ваш код должен быть таким
и во-вторых, вам нужно истечь срок действия токена, который был создан при входе в систему.
@api_view(['GET'])
def logout_user(request):
request.user.auth_token.delete()
logout(request)
return HttpResponse("logged out")