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 дней, то активные пользователи смогут войти в систему очень быстро.

Вернуться на верх