2016-10-26 2 views
0

Je veux restreindre l'accès à une vue particulière de sorte que seules les requêtes AJAX sont acceptées, donc je mis en œuvre le décorateur suivant:Django: décorateur en vue à partir de la classe

def require_ajax(func): 
    def decorator(func): 
     def inner(request, *args, **kwargs): 
      if not request.is_ajax(): 
       return HttpResponseBadRequest() 
      return func(request, *args, **kwargs) 
     return inner 

    return decorator 

Cela fonctionne parfaitement dans les vues de la fonction, mais je ne peut pas comprendre comment l'utiliser dans les vues basées sur les classes. J'ai essayé this mais j'ai eu des erreurs, je suppose en raison de l'ancienne version de Django que j'utilise.

Et bien, mon point de vue basé sur les classes:

class AjaxView(TemplateView): 
    template_name = '...' 

    def get_context_data(self, **kwargs): 
    ... 
    return context 

    @method_decorator(require_ajax) 
    def dispatch(self, *args, **kwargs): 
     return super(AjaxView, self).dispatch(*args, **kwargs) 
+0

Quelles erreurs exactement? Je ne peux pas vraiment vous aider sans connaître le problème. L'utilisation de la méthode 'method_decorator' est une approche correcte, mais vous voudrez peut-être consulter la documentation de cette méthode sous Django 1.4. https://django.readthedocs.io/fr/1.4/topics/class-based-views.html?highlight=method_decorator#decorating-the-class – makaveli

+0

Vous aurez besoin de faire un mixin pour CBV - De la même manière 'login_required 'et' LoginRequiredMixin' fonctionnent – Sayse

+0

@makaveli l'erreur est à peu près le kwargs, il dit qu'il y a des kwargs inattendues (que j'utilise dans 'get_context_data'). – dabadaba

Répondre

0

La mise en œuvre du décorateur résolu différemment la question:

def require_ajax(func): 
    def decorator(request, *args, **kwargs): 
     if not request.is_ajax(): 
      return HttpResponseBadRequest() 
     return func(request, *args, **kwargs) 

    return decorator