Django-pgcrypto-fields занимает много времени при загрузке
Я использую django 2.2.13
и django-pgcrypto-fields 2.5.2
. Также я использую email
в качестве метода аутентификации. email
хранится как поле pgcrypto
. Имеется около 10000 активных пользователей. Когда пользователь пытается войти в систему, это занимает много времени (8-9 секунд). Я пытался войти в систему из shell, это также занимает много времени.
from django.contrib.auth import authenticate
user = authenticate(email='john@gmail.com', password='secret')
На выполнение функции authenticate уходит почти 7-8 секунд.
user = authenticate(username='john', password='secret')
Когда я пытаюсь пройти аутентификацию с помощью username
, она выполняется в течение 1 секунды
from app.models import User
user = User.objects.filter(email=email).first()
Вышеприведенный запрос также выполняется долго (7-8 секунд). Я пробовал индексировать столбец email, но результат тот же. Как я могу ускорить запросы аутентификации и фильтрации для полей pgcrypto?
У меня есть обходное решение. Я сузил список пользователей по last_login
и переопределил _authenticate_by_email
метод django-allauth
class CustomAuthenticationBackend(AuthenticationBackend):
def _authenticate_by_email(self, **credentials):
email = credentials.get('email', credentials.get('username'))
if email:
startdate= timezone.now() - timedelta(days=CACHED_AUTHENTICATION_DAY)
user = User.objects.filter(last_login__gte=startdate, email=email).first()
if user:
if self._check_password(user, credentials["password"]):
return user
return None
for user in filter_users_by_email(email):
if self._check_password(user, credentials["password"]):
return user
return None
Так что если CACHED_AUTHENTICATION_DAY
установить значение 30/60 дней, то активные пользователи смогут войти в систему очень быстро.