J'ai un peu de mal à comprendre comment fonctionnent les nouveaux CBV. Ma question est la suivante, je dois exiger une connexion dans toutes les vues, et dans certaines d'entre elles, des autorisations spécifiques. Dans les vues basées sur les fonctions, je fais cela avec @permission_required () et l'attribut login_required dans la vue, mais je ne sais pas comment faire cela sur les nouvelles vues. Y a-t-il une section dans la documentation django expliquant cela? Je n'ai rien trouvé. Quel est le problème dans mon code?
J'ai essayé d'utiliser le @method_decorator mais il répond " TypeError at / spaces / prueba / _wrapped_view () prend au moins 1 argument (0 donné) "
Voici le code (GPL):
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required, permission_required
class ViewSpaceIndex(DetailView):
"""
Show the index page of a space. Get various extra contexts to get the
information for that space.
The get_object method searches in the user 'spaces' field if the current
space is allowed, if not, he is redirected to a 'nor allowed' page.
"""
context_object_name = 'get_place'
template_name = 'spaces/space_index.html'
@method_decorator(login_required)
def get_object(self):
space_name = self.kwargs['space_name']
for i in self.request.user.profile.spaces.all():
if i.url == space_name:
return get_object_or_404(Space, url = space_name)
self.template_name = 'not_allowed.html'
return get_object_or_404(Space, url = space_name)
# Get extra context data
def get_context_data(self, **kwargs):
context = super(ViewSpaceIndex, self).get_context_data(**kwargs)
place = get_object_or_404(Space, url=self.kwargs['space_name'])
context['entities'] = Entity.objects.filter(space=place.id)
context['documents'] = Document.objects.filter(space=place.id)
context['proposals'] = Proposal.objects.filter(space=place.id).order_by('-pub_date')
context['publication'] = Post.objects.filter(post_space=place.id).order_by('-post_pubdate')
return context
la source
message
?Voici mon approche, je crée un mixin qui est protégé (ceci est conservé dans ma bibliothèque mixin):
Chaque fois que vous voulez qu'une vue soit protégée, ajoutez simplement le mixin approprié:
Assurez-vous simplement que votre mixin est le premier.
Mise à jour: J'ai posté ceci en 2011, à partir de la version 1.9 Django inclut maintenant ceci et d'autres mixins utiles (AccessMixin, PermissionRequiredMixin, UserPassesTestMixin) en standard!
la source
Voici une alternative utilisant des décorateurs basés sur les classes:
Cela peut ensuite être utilisé simplement comme ceci:
la source
class_view_decorator(my_decorator(*args, **kwargs))
. En ce qui concerne la correspondance de méthode conditionnelle, vous pouvez modifier le class_view_decorator pour qu'il s'applique àView.get
ou à laView.post
place deView.dispatch
.Je me rends compte que ce fil est un peu daté, mais voici mes deux cents quand même.
avec le code suivant:
nous avons maintenant un moyen de patcher un décorateur, il deviendra donc multifonctionnel. Cela signifie effectivement que lorsqu'il est appliqué à un décorateur de vue standard, comme ceci:
ce décorateur fonctionnera toujours lorsqu'il est utilisé comme il était initialement prévu:
mais fonctionnera également correctement lorsqu'il est utilisé comme ceci:
Cela semble fonctionner correctement dans plusieurs cas que j'ai récemment rencontrés, y compris cet exemple réel:
La fonction ajax_view est écrite pour modifier une vue (basée sur une fonction), de sorte qu'elle déclenche une erreur 404 chaque fois que cette vue est visitée par un appel non ajax. En appliquant simplement la fonction de patch en tant que décorateur, ce décorateur est également prêt à fonctionner dans des vues basées sur les classes.
la source
Pour ceux d' entre vous qui utilisent Django> = 1.9 , il est déjà inclus dans
django.contrib.auth.mixins
commeAccessMixin
,LoginRequiredMixin
,PermissionRequiredMixin
etUserPassesTestMixin
.Donc, pour appliquer LoginRequired à CBV (par exemple
DetailView
):Il est également bon de garder à l'esprit l'ordre GCBV Mixin: les mixins doivent aller du côté gauche et la classe de vue de base doit aller du côté droit . Si l'ordre est différent, vous pouvez obtenir des résultats cassés et imprévisibles.
la source
Utilisez les accolades Django. Il fournit de nombreux mixins utiles facilement disponibles. Il a de beaux documents. Essaye le.
Vous pouvez même créer vos mixins personnalisés.
http://django-braces.readthedocs.org/en/v1.4.0/
Exemple de code:
la source
S'il s'agit d'un site où la majorité des pages nécessite que l'utilisateur soit connecté, vous pouvez utiliser un middleware pour forcer la connexion sur toutes les vues sauf certaines qui sont spécialement marquées.
Middleware.py pré Django 1.10:
views.py:
Les vues tierces que vous ne souhaitez pas encapsuler peuvent être supprimées dans les paramètres:
settings.py:
la source
Dans mon code, j'ai écrit cet adaptateur pour adapter les fonctions membres à une fonction non membre:
Vous pouvez simplement l'utiliser comme ceci:
la source
method_decorator
est). Cela semble être une manière agréable et lisible d'y parvenir.C'est super facile avec django> 1.9 avec support pour
PermissionRequiredMixin
etLoginRequiredMixin
Importez simplement depuis l'authentification
views.py
Pour plus de détails, lisez Autorisation dans django
la source
Cela fait un moment maintenant et maintenant Django a tellement changé.
Vérifiez ici comment décorer une vue basée sur les classes.
https://docs.djangoproject.com/en/2.2/topics/class-based-views/intro/#decorating-the-class
La documentation n'incluait pas d'exemple de "décorateurs qui acceptent n'importe quel argument". Mais les décorateurs qui acceptent des arguments sont comme ceci:
donc si nous devons utiliser mydec comme décorateur "normal" sans arguments, nous pouvons le faire:
De même, à utiliser
permission_required
avecmethod_decorator
nous pouvons faire:
la source
Si vous effectuez un projet qui nécessite divers tests d'autorisation, vous pouvez hériter de cette classe.
la source
J'ai fait ce correctif basé sur la solution de Josh
Exemple d'utilisation:
la source
Voici la solution pour le décorateur permission_required:
la source