2016-07-27 27 views
1

ich alle Unterlagen auf Django und andere Antworten hier in Stackoverflow versucht, aber das Ergebnis ist immer noch (CSRF-Token fehlt oder falsch ist)Django Ajax-Request führt noch zu CSRF-Token Fehlende oder falsche

Also hier meine Ansicht in Aussicht ist Py:

class MyView(View): 
    @method_decorator(ensure_csrf_cookie) 
    def post(self, request, *args, **kwargs): 
     t = TemplateResponse(request, 'mytemplate.html', data) 
     t.render() 
     return JsonResponse({'html' : t.content, 'title' : data['title']}) 

und dies ist die ajax in meiner JS-Datei, die für ein Click-Ereignis in einer Funktion:

 $.ajax({ 
      url: window.location.href, 
      type: 'POST', 
      data: data, 
      beforeSend: 
       function(xhr, settings) { 
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 
         var token = $.cookie('csrftoken'); 
         console.log(token); 
         xhr.setRequestHeader("X-CSRFToken", token); 
        } 
       }, 
      success: 
       function(result) { 
       }, 
     }); 

der erste Anruf ist erfolgreich, aber die succeedin g Anruf führt zu fehlendem Token.

Für das Debugging habe ich console.log verwendet und es wird bei jedem Klick ein anderes Token zurückgegeben.

+0

Können Sie den Code versuchen zu bewegen, die das Token ('var token = $ .cookie ('csrftoken');') wird in die 'beforeSend' Funktion? – solarissmoke

+0

@solarissmoke Ich habe das schon probiert. :(Funktioniert immer noch nicht. – Red

+0

Kannst du bestätigen, dass der 'X-CSRFToken'-Header tatsächlich für nachfolgende Anfragen gesendet wird? Dieser Code befindet sich in einem 'if'-Block und du hast ihn nicht gepostet Code für diese Überprüfungen – solarissmoke

Antwort

1

Fügen Sie den folgenden Code in das Skript ein. Dies wird die csrf Token in der Anforderung in jedem Ajax-Request

1. senden csrf Token

// using jQuery 
function getCookie(name) { 
    var cookieValue = null; 
    if (document.cookie && document.cookie !== '') { 
     var cookies = document.cookie.split(';'); 
     for (var i = 0; i < cookies.length; i++) { 
      var cookie = jQuery.trim(cookies[i]); 
      // Does this cookie string begin with the name we want? 
      if (cookie.substring(0, name.length + 1) === (name + '=')) { 
       cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
       break; 
      } 
     } 
    } 
    return cookieValue; 
} 
var csrftoken = getCookie('csrftoken'); 

2. Dies wird csrf Token auf jeder Ajax-Anforderung senden

Dies ermöglicht zu bekommen
function csrfSafeMethod(method) { 
    // these HTTP methods do not require CSRF protection 
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
} 

$.ajaxSetup({ 
    beforeSend: function(xhr, settings) { 
     if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 
      xhr.setRequestHeader("X-CSRFToken", csrftoken); 
     } 
    } 
}); 

3.Now Ihre ajax-Anforderung senden

$.ajax({ 
    url: window.location.href, 
    type: 'POST', 
    data: data, 
    success: function(result) { 
     console.log(result); 
    }, 
}); 

Für weitere Informationen besuchen django official documentation