Magazine Internet

Réécrire et adapter le decorator « login_required » de Django

Publié le 11 mars 2009 par Kphoen

Hey la compagnie !

django-logo-negative-small
Pour mon dernier site web (coming soon …), j’ai décidé d’étendre mes connaissances en Python au développement web, et plus particulièrement à Django. Je ne m’étenderai pas sur ce choix, ce dernier n’étant fondé que sur des conseils d’utilisateurs de django (ceci dit je ne regrette pas du tout de les avoir écoutés =D).

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 !


Retour à La Une de Logo Paperblog

A propos de l’auteur


Kphoen 5 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte

Magazine