Skip to content

Commit 41bc48a

Browse files
authored
Fixed #36603 -- Optimized check order in LoginRequiredMiddleware.
1 parent 46fdeb1 commit 41bc48a

2 files changed

Lines changed: 20 additions & 2 deletions

File tree

django/contrib/auth/middleware.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,10 @@ class LoginRequiredMiddleware(MiddlewareMixin):
5151
redirect_field_name = REDIRECT_FIELD_NAME
5252

5353
def process_view(self, request, view_func, view_args, view_kwargs):
54-
if request.user.is_authenticated:
54+
if not getattr(view_func, "login_required", True):
5555
return None
5656

57-
if not getattr(view_func, "login_required", True):
57+
if request.user.is_authenticated:
5858
return None
5959

6060
return self.handle_no_permission(request, view_func)

tests/auth_tests/test_middleware.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,3 +206,21 @@ def test_login_url_resolve_logic(self):
206206
def test_get_redirect_field_name_default(self):
207207
redirect_field_name = self.middleware.get_redirect_field_name(lambda: None)
208208
self.assertEqual(redirect_field_name, REDIRECT_FIELD_NAME)
209+
210+
def test_public_view_logged_in_performance(self):
211+
"""
212+
Public views don't trigger fetching the user from the database.
213+
"""
214+
self.client.force_login(self.user)
215+
with self.assertNumQueries(0):
216+
response = self.client.get("/public_view/")
217+
self.assertEqual(response.status_code, 200)
218+
219+
def test_protected_view_logged_in_performance(self):
220+
"""
221+
Protected views do trigger fetching the user from the database.
222+
"""
223+
self.client.force_login(self.user)
224+
with self.assertNumQueries(2): # session and user
225+
response = self.client.get("/protected_view/")
226+
self.assertEqual(response.status_code, 200)

0 commit comments

Comments
 (0)