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 !

Et


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