2016-07-27 135 views
1

我尝试了Django和其他答案的所有文件在这里StackOverflow的,但结果仍然是(CSRF令牌丢失或不正确)Django的Ajax请求仍然导致CSRF的令牌丢失或不正确

因此,这里是我的意见看法的.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']}) 

,这是我的js文件中的AJAX这是一个函数click事件:

 $.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) { 
       }, 
     }); 

第一个电话是成功的,但succeedin g电话导致丢失的标记。

为了调试,我使用了console.log,并且每次点击都返回一个不同的标记。

+0

你可以尝试得到令牌代码移动('VAR令牌= $ .cookie( 'csrftoken');')到'beforeSend'功能? – solarissmoke

+0

@solarissmoke我已经试过了。:(仍然没有工作。 – Red

+0

你能确认'X-CSRFToken'头文件是否真的被发送给后续请求吗?该代码位于'if'块中,并且你没有发布代码这些检查 – solarissmoke

回答

1

在脚本中添加以下代码。这将发送CSRF令牌在请求中的每个Ajax请求

1.这将允许获得CSRF令牌

// 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.这将发送CSRF令牌上的每个Ajax请求

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发送您的Ajax请求

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

欲了解更多信息,请访问django official documentation

相关问题