How to write a custom decorator in django? How to write a custom decorator in django? python python

How to write a custom decorator in django?


Played around with the various links above and couldn't get them working and then came across this really simple one which I adapted. http://code.activestate.com/recipes/498217-custom-django-login_required-decorator/

from functools import wrapsfrom django.http import HttpResponseRedirectdef authors_only(function):  @wraps(function)  def wrap(request, *args, **kwargs):        profile = request.user.get_profile()        if profile.usertype == 'Author':             return function(request, *args, **kwargs)        else:            return HttpResponseRedirect('/')  return wrap

Using @wraps is better than manually overriding like doing wrap.__doc__ = fn.__doc__. Amongst other things, it ensures your wrapper function gets the same name as the wrapped function.

See https://docs.python.org/2/library/functools.html


You don't have to write your own decorator for this as user_passes_test is already included in Django.

And there's a snippet (group_required_decorator) that extends this decorator and which should be pretty appropriate for your use case.

If you really want to write your own decorator then there's a lot of good documentation on the net.

And well, to (re-) use the decorator just put your decorator in a module on your path and you can import it from any other module.


Thanks to arie, the answer helped a long way, but it doesn't work for me.

When I found this snippet, I got it to work properly: http://djangosnippets.org/snippets/983/

This solution worked for me:

The helper function

This function has the benefit of being reusable in other places, as a drop in replacement for user.is_authenticated. It could for instance be exposed as a template tag.

def my_custom_authenticated(user):    if user:        if user.is_authenticated():            return user.groups.filter(name=settings.MY_CUSTOM_GROUP_NAME).exists()    return False

The decorator

I just put this at the top of my views.py, since it's so short.

def membership_required(fn=None):    decorator = user_passes_test(my_custom_authenticated)    if fn:        return decorator(fn)    return decorator

Using it

@membership_requireddef some_view(request):    ...