Django-allauth не смог войти в систему для существующего пользователя
Я использую Django 5 и django-allauth. В настоящее время я не использую никаких дополнительных возможностей этой библиотеки, единственные причины, по которым я ее использую:
- Имеет хорошо развитый рабочий процесс с функцией email opt-in .
- Поддерживает аутентификацию как по имени пользователя, так и по электронной почте.
Вот мои настройки, связанные с библиотекой:
# django-allauth specific settings for regular accounts not including the social authentication part.
ACCOUNT_AUTHENTICATION_METHOD="username_email"
ACCOUNT_CHANGE_EMAIL=True
ACCOUNT_CONFIRM_EMAIL_ON_GET=False
ACCOUNT_EMAIL_REQUIRED=True
ACCOUNT_EMAIL_VERIFICATION="mandatory"
ACCOUNT_UNIQUE_EMAIL=True
ACCOUNT_DEFAULT_HTTP_PROTOCOL="https"
ACCOUNT_MAX_EMAIL_ADDRESSES=2
ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE=True
ACCOUNT_LOGIN_ON_PASSWORD_RESET=True
ACCOUNT_SESSION_REMEMBER=True
ACCOUNT_USERNAME_REQUIRED=False
ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE=False
# Our specific signup and login forms with special styling
ACCOUNT_FORMS = {'signup': 'user_profile.forms.CustomSignupForm',
'login': 'user_profile.forms.CustomLoginForm'}
Единственная роль CustomLoginForm заключается в том, чтобы иметь настроенный css:
from allauth.account.forms import LoginForm
class CustomLoginForm(LoginForm):
def __init__(self,*args, **kwargs):
super().__init__(*args, **kwargs)
# The parent class does similar. The only reason we had to make custom loginform
# to handle bootstrap css
self.fields["login"].widget.attrs.update({"class": TEXT_INPUT_CLASS})
if app_settings.AuthenticationMethod == AuthenticationMethod.USERNAME:
self.fields["login"].widget.attrs.update({"placeholder": "Felhasználónév",
"autocomplete": "username"})
elif app_settings.AuthenticationMethod == AuthenticationMethod.EMAIL:
self.fields["login"].widget.attrs.update({"placeholder": "Email cím",
"autocomplete": "email"})
else:
self.fields["login"].widget.attrs.update({"placeholder": "Email cím / felhasználónév",
"autocomplete": "email"})
self.fields["password"].widget.attrs.update({"class": TEXT_INPUT_CLASS,
"placeholder": "Add meg a jelszavad",
"autocomplete": "password"})
Когда я запускаю свой сервер разработки, чтобы узнать, почему я не могу войти в систему с существующим именем пользователя и паролем, я использовал панель инструментов отладки, чтобы увидеть SQLS, созданные ORM:
SELECT "auth_user"."id",
"auth_user"."password",
"auth_user"."last_login",
"auth_user"."is_superuser",
"auth_user"."username",
"auth_user"."first_name",
"auth_user"."last_name",
"auth_user"."email",
"auth_user"."is_staff",
"auth_user"."is_active",
"auth_user"."date_joined"
FROM "auth_user"
WHERE "auth_user"."username" = '''1@example.com'''
LIMIT 21
SELECT "account_emailaddress"."id",
"account_emailaddress"."user_id",
"account_emailaddress"."email",
"account_emailaddress"."verified",
"account_emailaddress"."primary"
FROM "account_emailaddress"
WHERE "account_emailaddress"."email" LIKE '''1@example.com''' ESCAPE '\'
SELECT "auth_user"."id",
"auth_user"."password",
"auth_user"."last_login",
"auth_user"."is_superuser",
"auth_user"."username",
"auth_user"."first_name",
"auth_user"."last_name",
"auth_user"."email",
"auth_user"."is_staff",
"auth_user"."is_active",
"auth_user"."date_joined"
FROM "auth_user"
WHERE "auth_user"."id" IN ('4')
SELECT "auth_user"."id",
"auth_user"."password",
"auth_user"."last_login",
"auth_user"."is_superuser",
"auth_user"."username",
"auth_user"."first_name",
"auth_user"."last_name",
"auth_user"."email",
"auth_user"."is_staff",
"auth_user"."is_active",
"auth_user"."date_joined"
FROM "auth_user"
WHERE "auth_user"."username" LIKE '''1@example.com''' ESCAPE '\'
LIMIT 21
Поскольку пользователи могут входить в систему по имени пользователя или электронной почте, вполне разумно видеть несколько запросов. Единственное, что мне непонятно, - почему строковые литералы в условиях where окружены 4 дополнительными кавычками?
Если я убираю лишние кавычки, запрос выдает совпадающего пользователя в браузере Sqlite. Если не удалять лишние кавычки, то не выдает.
Какой код ставит лишние кавычки и почему? Как это можно исправить?