django使用資料庫快取時避免使用者鑑權頻繁查詢使用者資料
阿新 • • 發佈:2018-12-12
一個特殊的業務場景,需要使用資料庫作為快取,導致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