Функция Django Authenticate всегда возвращает девять, даже после внесения необходимых изменений в settings.py
Я пытаюсь создать систему входа в систему с помощью Django python. Хотя функция Authenticate всегда возвращает значение none, даже после внесения определенных изменений в settings.py, как было предложено в других ответах на StackOverflow. Я попробовал запустить этот код в режиме отладки в visual studio code и обнаружил, что проблема заключается только в функции authenticate, так как она всегда none, и код, следовательно, никогда не может войти в систему ни один пользователь.
Вот мой код:
- views.py(функция входа в систему)
from django.http import HttpResponse
from django.shortcuts import redirect, render
from django.contrib.auth.models import User
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.contrib import messages
# Create your views here.
def home(request):
return render(request, 'Home_Page.html')
def signup(request):
if request.user.is_anonymous:
if request.method == 'POST':
if User.objects.filter(username=request.POST.get('username').upper()).exists():
messages.error(request, 'The username already exists')
elif User.objects.filter(email=request.POST.get('email').lower()).exists():
messages.error(request, 'The Email already exists')
else:
user = User.objects.create_user(username=request.POST.get('username').upper(), email=request.POST.get('email').lower(), password=request.POST.get(
'password'), first_name=request.POST.get('firstname'), last_name=request.POST.get('lastname'))
user.save()
return redirect('home')
return render(request, 'Signup_Page.html')
else:
return redirect('/dashboard')
def login(request):
if request.user.is_anonymous:
if request.method == 'POST':
user = authenticate(username=request.POST.get(
'username'), password=request.POST.get('password'))
if user is not None:
login(request, user)
return redirect('/dashboard')
else:
return render(request, 'Login_Page.html')
else:
return render(request, 'Login_Page.html')
else:
return redirect('/dashboard')
def logout(request):
if not request.user.is_anonymous:
logout(request)
return HttpResponse("Home Page")
return redirect('/')
- Login_Page.html
- Settings.py
Как указал @Iain Shelvington, проблема начинается с того, что пользователь создается с параметром username
, установленным в uppercase
-> username=request.POST.get('username').upper()
.
user = User.objects.create_user(username=request.POST.get('username').upper(), email=request.POST.get('email').lower(), password=request.POST.get('password'), first_name=request.POST.get('firstname'), last_name=request.POST.get('lastname'))
Тогда способ, которым вы передаете username
в authenticate()
- без upper()
.
user = authenticate(username=request.POST.get('username'), password=request.POST.get('password'))
Таким образом, вы можете удалить upper()
из имени пользователя при создании пользователя, или добавить upper()
к имени пользователя в authenticate()
.
Однако, я вижу, что у вас есть два метода под названием login()
. Django login()
и определенный метод login()
. Это может вызвать некоторую проблему и у вас. Я бы предложил вам переименовать ваш определенный метод login()
на что-то вроде: login_view()
, чтобы он не затенял Django login()
. Например:
# your defined method here; rename to login_view:
def login_view(request):
...
# so it won't shadow the login method from Django
login(request, users)
...
Иначе вы получите ошибку типа:
Тип исключения: TypeError at /login/ Exception Value: login() принимает 1 позиционный аргумент, но было дано 2
Вы можете взглянуть на этот ответ, чтобы лучше понять, если это необходимо.