91 votes

Comment exiger de connexion pour django générique point de vue?

Je veux restreindre l'accès à des url sert par django générique point de vue. De mon point de vue je sais que login_required décorateur fait le travail. Aussi Créer/mettre à jour/supprimer des vues génériques prend login_requied argument, mais je ne pouvais pas trouver un moyen de le faire pour un autre générique point de vue.

108voto

Hamish Downer Points 4086

J'ai trouvé cette question pendant googler pour savoir comment décorer la classe de base de points de vue, afin d'ajouter de la réponse:

Ce qui est couvert dans la section de la documentation sur la décoration de la classe de base de points de vue. Il est l' urls.py wrapper, ou vous pouvez appliquer le décorateur à l' dispatch() méthode. Les exemples de la documentation:

La décoration dans l'URL de la conf

from django.contrib.auth.decorators import login_required, permission_required
from django.views.generic import TemplateView

from .views import VoteView

urlpatterns = patterns('',
    (r'^about/', login_required(TemplateView.as_view(template_name="secret.html"))),
    (r'^vote/', permission_required('polls.can_vote')(VoteView.as_view())),
)

La décoration de la classe

from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView

class ProtectedView(TemplateView):
    template_name = 'secret.html'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(ProtectedView, self).dispatch(*args, **kwargs)

Consultez la documentation lié ci-dessus pour plus de détails.

106voto

Will Hardy Points 6663

Pour Django < 1.5, vous pouvez ajouter un décorateur en enveloppant la fonction dans votre url, ce qui vous permet d'emballer le générique de points de vue:

from django.contrib.auth.decorators import login_required
from django.views.generic.simple import direct_to_template
urlpatterns = patterns('',
    (r'^foo/$', login_required(direct_to_template), {'template': 'foo_index.html'}),
    )

La fonction générique de vues sont déconseillés dans Django 1.4 et ont été supprimés dans Django 1.5. Mais le même principe s'applique, juste envelopper le point de vue de la fonction de la classe de base point de vue avec l' login_required décorateur:

login_required(TemplateView.as_view(template_name='foo_index.html'))

38voto

Brian Fisher Points 10755

Le générique de points de vue ont changé de fonctions à des objets avec la version 1.3 de Django. En tant que tel, il est une légère modification nécessaire pour McCutchen et Hardy réponses avec la version 1.3:

from django.contrib.auth.decorators import login_required
from django.views.generic import TemplateView

urlpatterns = patterns('',
    (r'^foo/$', login_required(TemplateView.as_view(template_name='foo_index.html'))),
)

Aussi la documentation explique comment faire cela.

12voto

Will McCutchen Points 8193

Si vous ne voulez pas écrire votre propre mince enveloppe le générique de points de vue en question (comme Aamir suggéré), vous pouvez aussi faire quelque chose comme ceci dans votre urls.py le fichier:

from django.conf.urls.defaults import *

# Directly import whatever generic views you're using and the login_required
# decorator
from django.views.generic.simple import direct_to_template
from django.contrib.auth.decorators import login_required

# In your urlpatterns, wrap the generic view with the decorator
urlpatterns = patterns('',
    (r'', login_required(direct_to_template), {'template': 'index.html'}),
    # etc
)

3voto

Julian Points 1517

Je voulais une ré-utilisable pour exiger l'authentification sur de nombreux points de vue provenant de générique point de vue. J'ai créé un remplacement de la fonction de répartition qui je peux ajouter à mon point de vue de classe de la même manière comme il est d'autres déclarations.

class Index(generic.ListView):
    model = models.HomePage
    dispatch = auth.dispatch

auth.l'expédition est là où on ne l'oeuvre:

def dispatch(self, request, *args, **kw):
    """Mix-in for generic views"""
    if userSession(request):
        return  super(self.__class__, self).dispatch(request, *args, **kw)

    # auth failed, return login screen
    response = user(request)
    response.set_cookie('afterauth', value=request.path_info)
    return response

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X