On 17 nov, 10:02, TH <[EMAIL PROTECTED]> wrote:
> Hello,
>
> I wanted to redirect a logged in user if he access certain page. For
> example i do not want the user to access registration page if he is
> logged in.
>
> A simple way to do this is:
>
> def register(request):
> if request.user.is_authenticated():
> return HttpResponseRedirect('/
> some_nice_page_for_logged_in_user')
> ...
>
> The problem is i have lot of pages that only anonymous user can
> access. So i wanted to write a decorator so that i can do something
> like that
>
> @anonymous_only
> def register(request):
A "decorator" is just a function (or any other callable) that takes a
function as argument and returns a function (or any other callable).
The @decorator syntax is only syntactic sugar.
In most cases, the returned function is just a wrapper around the
decorated one, and this is obviously what you want:
def anonymous_only(view):
# 'view' is the view function to decorate
# since we decorate views, we know the first parameter
# is always going to be the current request
#
# '_wrapper' is the function that will be used instead
# of 'view'.
def _wrapper(request, *args, **kw):
# here we can access the request object and
# either redirect or call 'view'
if request.user.is_authenticated():
return HttpResponseRedirect('/page_for_logged_in_user')
return view(request, *args, **kw)
# this part is not mandatory, but it may help debugging
_wrapper.__name__ = view.__name___
_wrapper.__doc__ = view.__doc__
# and of course we need to return our _wrapper so
# it replaces 'view'
return _wrapper
Note that this example assume you always want to redirect to the same
page if the user is logged in, which might not be the case. Things get
a bit more complicated if you want your decorator to takes the
redirection url as param, since we'll then need one more indirection,
IOW : a function that takes an url and returns a function that takes a
function and returns a 'wrapper':
def anonymous_only(redirect_to):
def deco(view):
def _wrapper(request, *args, **kw):
if request.user.is_authenticated():
return HttpResponseRedirect(redirect_to)
return view(request, *args, **kw)
_wrapper.__name__ = view.__name___
_wrapper.__doc__ = view.__doc__
return _wrapper
return deco
Then you use it that way:
@anonymous_only('/page_for_logged_in_user')
def register(request):
# code here
HTH
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---