2014-12-05 15 views
27
class ChromeLoginView(View): 

    def get(self, request): 
      return JsonResponse({'status': request.user.is_authenticated()}) 

    @method_decorator(csrf_exempt) 
    def post(self, request): 
      username = request.POST['username'] 
      password = request.POST['password'] 
      user = authenticate(username=username, password=password) 
      if user is not None: 
       if user.is_active: 
        login(request, user) 
        return JsonResponse({'status': True}) 
      return JsonResponse({'status': False}) 

Mi aspetto che il post venga arrestato da csrf, ma restituisce l'errore 403.@csrf_exempt non funziona sulla classe generica vista basata

Ma se rimuovere tale decoratore e farlo nel URLConf

url(r'^chrome_login/', csrf_exempt(ChromeLoginView.as_view()), name='chrome_login'), 

che funzionerà.

Che cosa è successo qui? non doveva funzionare, perché immagino sia quello che fa method_decorator. Sto usando python3.4 e django1.7.1

Qualsiasi consiglio sarebbe fantastico.

+0

Si dovrebbe esaminare le django_braces ... – rnevius

+0

@rnevius grazie mille, non si sa mai questo mixin lib per django prima. – castiel

+1

È fantastico! Tanto più che puoi semplicemente aggiungere [CsrfExemptMixin] (https://django-braces.readthedocs.org/en/v1.4.0/form.html#csrfexemptmixin) alla tua vista per farlo funzionare. È quasi come imbrogliare ... – rnevius

risposta

45

È necessario decorare il metodo dispatch per csrf_exempt per funzionare. Quello che fa è impostare un attributo csrf_exempt sulla funzione di visualizzazione stessa su True e il controllo di middleware per questo sulla funzione di visualizzazione (più esterna). Se solo alcuni dei metodi devono essere decorati, è comunque necessario utilizzare csrf_exempt nel metodo dispatch, ma è possibile utilizzare csrf_protect su es. put(). Se viene utilizzato un metodo GET, HEAD, OPTIONS o TRACE HTTP, non verrà controllato se lo si decora o meno.

class ChromeLoginView(View): 
    @method_decorator(csrf_exempt) 
    def dispatch(self, request, *args, **kwargs): 
     return super(ChromeLoginView, self).dispatch(request, *args, **kwargs) 

    def get(self, request): 
     return JsonResponse({'status': request.user.is_authenticated()}) 

    def post(self, request): 
     username = request.POST['username'] 
     password = request.POST['password'] 
     user = authenticate(username=username, password=password) 
     if user is not None: 
      if user.is_active: 
       login(request, user) 
       return JsonResponse({'status': True}) 
     return JsonResponse({'status': False}) 
34

Come @knbk detto, questo è il metodo dispatch() che deve essere decorato.

Dal Django 1.9, you can use the method_decorator directly on a class:

@method_decorator(csrf_exempt, name='dispatch') 
class ChromeLoginView(View): 

    def get(self, request): 
     return JsonResponse({'status': request.user.is_authenticated()}) 

    def post(self, request): 
     username = request.POST['username'] 
     password = request.POST['password'] 
     user = authenticate(username=username, password=password) 
     if user is not None: 
      if user.is_active: 
       login(request, user) 
       return JsonResponse({'status': True}) 
     return JsonResponse({'status': False}) 

Questo evita l'override del metodo dispatch() solo per decorare.

Problemi correlati