1. 程式人生 > >django使用資料庫快取時避免使用者鑑權頻繁查詢使用者資料

django使用資料庫快取時避免使用者鑑權頻繁查詢使用者資料

一個特殊的業務場景,需要使用資料庫作為快取,導致django在使用者鑑權時頻繁查詢資料庫,使用者訪問每個需要許可權的頁面都會查詢一次。為了減少資料庫開銷,把使用者資料快取,需要過載AUTHENTICATION_BACKENDS配置。

AUTHENTICATION_BACKENDS = ['mysite.backends.ModelBackend']

然後自定義的ModelBackend如下:

from django.conf import settings
from django.core.cache import cache
from cUnicomPlatform.models import User
from django.contrib.auth.backends import ModelBackend


def update_cache_user(user):
    cache_key = 'user:%s' % user.phone
    user_info = {
        'last_login': user.last_login,
        'is_superuser': user.is_superuser,
        'first_name': user.first_name,
        'last_name': user.last_name,
        'email': user.email,
        'is_staff': user.is_staff,
        'is_active': user.is_active,
        'date_joined': user.date_joined,
        'username': user.username,
        'password': user.password,
        'phone': user.phone,
        'avatar': user.avatar
    }
    cache.set(cache_key, user_info, settings.SESSION_COOKIE_AGE)


class ModelBackend(ModelBackend):
    def get_user(self, user_id):
        cache_key = 'user:%s' % user_id
        user = cache.get(cache_key)
        if user:
            user = User(**user)
        else:
            try:
                user = User._default_manager.get(pk=user_id)
                update_cache_user(user)
            except User.DoesNotExist:
                return None
        return user if self.user_can_authenticate(user) else None