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.
Réponses
Trop de publicités?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.
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'))
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.
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
)
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