#django #django-authentication
Вопрос:
Я реализовал стандартный вход в систему Django следующим образом:
from django.contrib.auth import authenticate, login, logout
def login_request(request):
username = password = ""
if request.POST:
username = request.POST["username"].lower()
password = request.POST["password"]
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
return redirect("../..")
return render(request, "login.html", context={"error": "TRUE"})
return render(request, "login.html", context={"error": "FALSE"})
Для большинства пользователей это сработало нормально. Тем не менее, для некоторых пользователей это приводило к следующей ошибке:
Traceback (most recent call last):
File "/home/ubuntu/qq_api/venv/local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/home/ubuntu/qq_api/venv/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 179, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/ubuntu/qq_api/core/views.py", line 110, in login_request
login(request, user)
File "/home/ubuntu/qq_api/venv/local/lib/python3.6/site-packages/django/contrib/auth/__init__.py", line 132, in login
user_logged_in.send(sender=user.__class__, request=request, user=user)
File "/home/ubuntu/qq_api/venv/local/lib/python3.6/site-packages/django/dispatch/dispatcher.py", line 179, in send
for receiver in self._live_receivers(sender)
File "/home/ubuntu/qq_api/venv/local/lib/python3.6/site-packages/django/dispatch/dispatcher.py", line 179, in <listcomp>
for receiver in self._live_receivers(sender)
File "/home/ubuntu/qq_api/venv/local/lib/python3.6/site-packages/django/contrib/auth/models.py", line 20, in update_last_login
user.save(update_fields=['last_login'])
File "/home/ubuntu/qq_api/venv/local/lib/python3.6/site-packages/django/contrib/auth/base_user.py", line 67, in save
super().save(*args, **kwargs)
File "/home/ubuntu/qq_api/venv/local/lib/python3.6/site-packages/django/db/models/base.py", line 751, in save
force_update=force_update, update_fields=update_fields)
File "/home/ubuntu/qq_api/venv/local/lib/python3.6/site-packages/django/db/models/base.py", line 789, in save_base
force_update, using, update_fields,
File "/home/ubuntu/qq_api/venv/local/lib/python3.6/site-packages/django/db/models/base.py", line 852, in _save_table
raise ValueError("Cannot force an update in save() with no primary key.")
Exception Type: ValueError at /login/
Exception Value: Cannot force an update in save() with no primary key.
Эта ошибка возвращается обратно в in . user.save(update_fields=['last_login'])
django/contrib/auth/models.py
Я не смог определить, почему возникает эта ошибка и почему она происходит с некоторыми пользователями, а не с другими. Я внимательно посмотрел и не смог найти ничего, что отличало бы пользователей, у которых была эта проблема, от тех, у кого ее не было.
Комментарии:
1. Пожалуйста, опубликуйте полную обратную связь.
2. Если вы создали свой собственный сервер аутентификации, это тоже может помочь поделиться им.
3. @WillemVanOnsem Добавил полную обратную связь. Я просто использую пакеты django.contrib.auth для аутентификации.
Ответ №1:
Исправление в функции входа в систему:
Удалить username=password=""
Комментарии:
1. Это ничего не исправило
2. Прости! но на месте
request.post:
этого должно бытьrequest.method=="POST":