Browse files

Fixed #903 -- Added login_url argument to user_passes_test view decor…

…ator. Didn't add it to login_required decorator because that would turn login_required into a callable decorator, which would break backwards compatibility.

git-svn-id: bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
1 parent d058a8a commit 8128f440ee74dd72f9204f657f6180a128dc8eaf @adrianholovaty adrianholovaty committed Nov 26, 2005
Showing with 29 additions and 7 deletions.
  1. +5 −4 django/views/auth/
  2. +4 −3 django/views/decorators/
  3. +20 −0 docs/authentication.txt
@@ -6,6 +6,7 @@
from django.utils.httpwrappers import HttpResponse, HttpResponseRedirect
+LOGIN_URL = '/accounts/login/'
def login(request):
"Displays the login form and handles the login action."
@@ -39,10 +40,10 @@ def logout(request, next_page=None):
# Redirect to this page until the session has been cleared.
return HttpResponseRedirect(next_page or request.path)
-def logout_then_login(request):
+def logout_then_login(request, login_url=LOGIN_URL):
"Logs out the user if he is logged in. Then redirects to the log-in page."
- return logout(request, '/accounts/login/')
+ return logout(request, login_url)
-def redirect_to_login(next):
+def redirect_to_login(next, login_url=LOGIN_URL):
"Redirects the user to the login page, passing the given 'next' page"
- return HttpResponseRedirect('/accounts/login/?%s=%s' % (REDIRECT_FIELD_NAME, next))
+ return HttpResponseRedirect('%s?%s=%s' % (login_url, REDIRECT_FIELD_NAME, next))
@@ -1,15 +1,16 @@
-def user_passes_test(test_func):
+from django.views.auth import login
+def user_passes_test(test_func, login_url=login.LOGIN_URL):
Decorator for views that checks that the user passes the given test,
redirecting to the log-in page if necessary. The test should be a callable
that takes the user object and returns True if the user passes.
def _dec(view_func):
def _checklogin(request, *args, **kwargs):
- from django.views.auth.login import redirect_to_login
if test_func(request.user):
return view_func(request, *args, **kwargs)
- return redirect_to_login(request.path)
+ return login.redirect_to_login(request.path, login_url)
return _checklogin
return _dec
@@ -314,6 +314,26 @@ Here's the same thing, using Python 2.4's decorator syntax::
Note that ``user_passes_test`` does not automatically check that the ``User``
is not anonymous.
+**New in the Django development version**: ``user_passes_test()`` takes an
+optional ``login_url`` argument, which lets you specify the URL for your login
+page (``/accounts/login/`` by default).
+Example in Python 2.3 syntax::
+ from django.views.decorators.auth import user_passes_test
+ def my_view(request):
+ # ...
+ my_view = user_passes_test(lambda u: u.has_perm('polls.can_vote'), login_url='/login/')(my_view)
+Example in Python 2.4 syntax::
+ from django.views.decorators.auth import user_passes_test
+ @user_passes_test(lambda u: u.has_perm('polls.can_vote'), login_url='/login/')
+ def my_view(request):
+ # ...
Limiting access to generic views

0 comments on commit 8128f44

Please sign in to comment.