Vous n'avez pas à écrire votre propre décorateur pour ce que user_passes_test est déjà inclus dans Django.
Et il y a un extrait de (group_required_decorator) qui s'étend cette décorateur et qui devrait être assez approprié pour votre cas d'utilisation.
Si vous voulez vraiment écrire votre propre décorateur puis, il y a beaucoup de une bonne documentation sur le net.
Et bien, à (ré) utiliser le décorateur, il suffit de mettre votre décorateur dans un module sur votre chemin et vous pouvez l'importer à partir de n'importe quel autre module.
def souk_required(): """oblige l'utilisateur à l'adhésion à au moins l'un des groupes de transmission.""" def has_souk(u): si u.is_authenticated(): si bool(SoukUsers.objets.get(personne = u)): return True return False(u) retour user_passes_test(has_souk)
il donne cette erreur - souk_required ne prend pas d'arguments (1 donnée)
Hm .. j'ai accidentellement upvoted votre commentaire 😉 eh Bien, vous avez retiré le devrait argument de vous définition de la fonction et donc de recevoir le message d'erreur. Donc, concernant la création d'un groupe "premiumusers" et d'ajouter vos utilisateurs à ce groupe? Ensuite, vous pouvez utiliser le fragment comme il est et il suffit de passer le nom de votre groupe.
ah oui ...... Je devrais totalement faire
Ce n'est pas votre faute, il arrive aux meilleurs d'entre nous ; ].... de toute façon merci beaucoup de l'homme... je vous dois beaucoup de temps.
from functools import wraps
from django.http importHttpResponseRedirectdef authors_only(function):@wraps(function)def wrap(request,*args,**kwargs):
profile = request.user.get_profile()if profile.usertype =='Author':return function(request,*args,**kwargs)else:returnHttpResponseRedirect('/')return wrap
À l'aide de @wraps est mieux que manuellement remplacer comme faire wrap.__doc__ = fn.__doc__. Entre autres choses, il s'assure que votre fonction wrapper obtient le même nom que le enveloppés fonction.
Cette fonction a l'avantage d'être réutilisables dans d'autres lieux, en remplacement de user.is_authenticated. Il pourrait par exemple être exposé comme une balise de modèle.
Ici est un peu différente de la mise en œuvre, ce qui permet à d'autres paramètres afin d'indiquer la page de redirection lors de la validation échoue et le message à afficher à l'utilisateur final:
from functools import wraps
from django.core.urlresolvers import reverse
from django.http importHttpResponseRedirectfrom core.helpers.flash import send_flash_error
def lender_only(redirect_to='plateforme.views.vue_login', error_flash_message=None):def inner_render(fn):@wraps(fn)# Ensure the wrapped function keeps the same name as the viewdef wrapped(request,*args,**kwargs):if request.context.user.is_authenticated and request.context.user.is_lender:return fn(request,*args,**kwargs)else:if error_flash_message:
send_flash_error(request, error_flash_message)# Replace by your own implementationreturnHttpResponseRedirect(reverse(redirect_to))return wrapped
return inner_render
# Usage:@lender_only('vitrine.views.projets',{'message':"Oops, can't go there."})def render_page_index(request):
Vous n'avez pas à écrire votre propre décorateur pour ce que
user_passes_test
est déjà inclus dans Django.Et il y a un extrait de (
group_required_decorator
) qui s'étend cette décorateur et qui devrait être assez approprié pour votre cas d'utilisation.Si vous voulez vraiment écrire votre propre décorateur puis, il y a beaucoup de une bonne documentation sur le net.
Et bien, à (ré) utiliser le décorateur, il suffit de mettre votre décorateur dans un module sur votre chemin et vous pouvez l'importer à partir de n'importe quel autre module.
Joué un peu avec les différents liens ci-dessus et ne pouvait pas obtenir de travail, puis est venu à travers ce vraiment simple à laquelle j'ai adapté. http://code.activestate.com/recipes/498217-custom-django-login_required-decorator/
À l'aide de
@wraps
est mieux que manuellement remplacer comme fairewrap.__doc__ = fn.__doc__
. Entre autres choses, il s'assure que votre fonction wrapper obtient le même nom que le enveloppés fonction.Voir https://docs.python.org/2/library/functools.html
wrap() takes at least 1 argument (0 given)
. Aucune idée pour le résoudre?Grâce à arie, la réponse a aidé un long chemin, mais il ne fonctionne pas pour moi.
Quand j'ai trouvé cet extrait de code, j'ai réussi à le faire fonctionner correctement: http://djangosnippets.org/snippets/983/
Cette solution a fonctionné pour moi:
La fonction d'assistance
Cette fonction a l'avantage d'être réutilisables dans d'autres lieux, en remplacement de
user.is_authenticated
. Il pourrait par exemple être exposé comme une balise de modèle.Le décorateur
Je viens de le mettre en haut de mon
views.py
, puisque c'est si court.De l'utiliser
Voir des exemples dans django lui-même:
http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/decorators.py
Votre exemple particulier est probablement juste une version de "user_passes_test' où le test va être membres de la "premium" du groupe.
À utiliser n'importe où, faire un paquet python et de l'importer à partir de là. Tant que sa sur votre sys.le chemin aurez trouvé.
http://www.makina-corpus.org/blog/permission-required-decorator-django
j'ai basé le mien hors billet de blog.
Le coller dans un fichier dans le python path ou dans un "util" application et l'importer dans vues:
par exemple
Ici est un peu différente de la mise en œuvre, ce qui permet à d'autres paramètres afin d'indiquer la page de redirection lors de la validation échoue et le message à afficher à l'utilisateur final:
Ce guide m'a aidé à s'en sortir: https://elfsternberg.com/2009/11/20/python-decorators-with-arguments-with-bonus-django-goodness/ à côté de la réponse à la question précédente