Hey la compagnie !

Parmi les « raccourcis » que met en place django, on retrouve le decorator « login_required » qui permet de restreindre l’accès à une vue aux utilisateurs authentifiés et de rediriger les autres vers la page de connexion. Sur le papier, c’était exactement ce qu’il me fallait. Mais en pratique, j’avais quelques améliorations à apporter =p
En effet, j’utilise dans tout le reste du site une fonction de redirection maison qui fait transiter le visiteur via une page dédiée à l’affichage d’un message explicitant la redirection (ex : « Vous devez être connecté pour voir cette page », « Connexion réussie », etc.). Mon but est donc de retrouver le même comportement avec le decorator de django, comportement qui est d’après mes recherches impossible d’obtenir …
Soit, je vais coder moi-même un decorator répondant à mes besoins
#-*- encoding:utf-8 -*-
from django.shortcuts import render_to_response
def if_logged_in(f, message='Vous devez être connecté pour pouvoir voir cette page.'):
""" Décorator pour refuser l'accès à une page aux users non connectés """
def wrap(request, *args, **kwargs):
if not request.user.is_authenticated():
return redirection(request, '/connexion/', message)
return f(request, *args, **kwargs)
wrap.__doc__ = f.__doc__
wrap.__name__ = f.__name__
return wrap
def redirection(request, REDIR_URL, REDIR_MESSAGE='Erreur !', REDIR_TIME=4):
"""
Fonction permettant de rediriger un user
les variables locales à la fonction pourront être utilisées dans le template
"""
return render_to_response('redirection.html', locals())
Pour ce qui est de l’utilisation, elle est identique à celle de n’importe quel decorator, y compris « login_required »

Enjoy !
