首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django-pgcrypto字段需要很长时间来加载

django-pgcrypto字段需要很长时间来加载
EN

Stack Overflow用户
提问于 2022-06-16 08:04:20
回答 1查看 93关注 0票数 0

我正在使用django 2.2.13django-pgcrypto-fields 2.5.2。此外,我还使用email作为身份验证方法。email存储为pgcrypto字段。大约有10000活跃用户。当用户尝试登录时,需要很长时间(8-9秒)。我试着从shell登录,这也需要很长时间。

代码语言:javascript
复制
from django.contrib.auth import authenticate
user = authenticate(email='john@gmail.com', password='secret')

身份验证函数的执行时间几乎为7-8秒。

代码语言:javascript
复制
user = authenticate(username='john', password='secret')

当我尝试使用username进行身份验证时,它将在1秒内执行。

代码语言:javascript
复制
from app.models import User
user = User.objects.filter(email=email).first()

上面的查询也需要很长时间才能执行(7-8秒)。我试着索引电子邮件列,但结果是一样的。如何加快对pgcrypto字段的身份验证和筛选查询?

EN

回答 1

Stack Overflow用户

发布于 2022-09-08 05:03:29

我有个解决办法。我通过last_login缩小了用户列表,并覆盖了django-allauth_authenticate_by_email方法。

代码语言:javascript
复制
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天,那么活动用户将能够非常快地登录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72642457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档