Skip to content

Commit 10ad6e8

Browse files
committed
Merge branch 'master' of github.com:ui/django-cached_authentication_middleware
2 parents 87594aa + 9462884 commit 10ad6e8

File tree

2 files changed

+49
-14
lines changed

2 files changed

+49
-14
lines changed

cached_auth/__init__.py

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
except ImportError:
1616
from django.contrib.auth.models import User
1717

18-
1918
CACHE_KEY = 'cached_auth_middleware:%s'
2019

2120

@@ -26,6 +25,30 @@
2625
profile_model = None
2726

2827

28+
def profile_preprocessor(user, request):
29+
""" Cache user profile """
30+
if profile_model:
31+
try:
32+
user.get_profile()
33+
# Handle exception for user with no profile and AnonymousUser
34+
except (profile_model.DoesNotExist, AttributeError):
35+
pass
36+
return user
37+
38+
39+
user_preprocessor = None
40+
if hasattr(settings, 'CACHED_AUTH_PREPROCESSOR'):
41+
tmp = settings.CACHED_AUTH_PREPROCESSOR.split(".")
42+
module_name, function_name = ".".join(tmp[0:-1]), tmp[-1]
43+
func = getattr(__import__(module_name, fromlist=['']), function_name)
44+
if callable(func):
45+
user_preprocessor = func
46+
else:
47+
raise Exception("CACHED_AUTH_PREPROCESSOR must be callable with 2 arguments user and request")
48+
else:
49+
user_preprocessor = profile_preprocessor
50+
51+
2952
def invalidate_cache(sender, instance, **kwargs):
3053
if isinstance(instance, User):
3154
key = CACHE_KEY % instance.id
@@ -41,17 +64,10 @@ def get_cached_user(request):
4164
user = cache.get(key)
4265
except KeyError:
4366
user = AnonymousUser()
44-
4567
if user is None:
4668
user = get_user(request)
47-
48-
# Try to populate profile cache if profile is installed
49-
if profile_model:
50-
try:
51-
user.get_profile()
52-
# Handle exception for user with no profile and AnonymousUser
53-
except (profile_model.DoesNotExist, AttributeError):
54-
pass
69+
if user_preprocessor:
70+
user = user_preprocessor(user, request)
5571
cache.set(key, user)
5672
request._cached_user = user
5773
return request._cached_user

cached_auth/tests.py

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22
from django.core.urlresolvers import reverse
33
from django.test import TestCase
44
from django.test.client import Client
5-
5+
from django.test.utils import override_settings
66
from cached_auth import CACHE_KEY
7+
from django.conf import settings
8+
9+
import cached_auth
710

811
try:
912
from django.contrib.auth import get_user_model
@@ -12,6 +15,11 @@
1215
from django.contrib.auth.models import User
1316

1417

18+
def auth_preprocessor(user, request):
19+
user.username = 'test_auth'
20+
return user
21+
22+
1523
class MiddlewareTest(TestCase):
1624

1725
def setUp(self):
@@ -25,18 +33,17 @@ def test_anonymous(self):
2533
# Anonymous user doesn't cause cache to be set
2634
client = Client()
2735
key = CACHE_KEY % self.user.id
28-
response = client.get(reverse('admin:index'))
36+
client.get(reverse('admin:index'))
2937
self.assertEqual(cache.get(key), None)
3038

31-
3239
def test_cached_middleware(self):
3340
client = Client()
3441
key = CACHE_KEY % self.user.id
3542
self.assertEqual(cache.get(key), None)
3643

3744
# Visiting admin causes the cache to be populated
3845
client.login(username='test', password='a')
39-
response = client.get(reverse('admin:index'))
46+
client.get(reverse('admin:index'))
4047
self.assertEqual(cache.get(key), self.user)
4148

4249
# Changing user model invalidates cache
@@ -48,3 +55,15 @@ def test_cached_middleware(self):
4855
self.assertEqual(cache.get(key), self.user)
4956
self.user.delete()
5057
self.assertEqual(cache.get(key), None)
58+
59+
@override_settings(CACHED_AUTH_PREPROCESSOR='cached_auth.tests.auth_preprocessor')
60+
def test_cached_auth_preprocessor_function(self):
61+
reload(cached_auth)
62+
client = Client()
63+
key = CACHE_KEY % self.user.id
64+
self.assertEqual(cache.get(key), None)
65+
66+
client.login(username='test', password='a')
67+
client.get(reverse('admin:index'))
68+
user = cache.get(key)
69+
self.assertEqual(user.username, 'test_auth')

0 commit comments

Comments
 (0)