如何在 django 中应用 csrf_token

Posted

技术标签:

【中文标题】如何在 django 中应用 csrf_token【英文标题】:how to apply csrf_token in django 【发布时间】:2014-09-23 05:29:11 【问题描述】:

在 Django 模板中,我想在不使用表单的情况下将文件上传到我的 Web 服务器。所以为此我正在使用名为 dropzonejs 的 javascript 库。

我完全按照本教程bootstrap dropzonejs。我设置了一切来运行演示。

你看我决定不使用form所以很明显问题csrf_token在上传发生时丢失了。

我的疑问是如何在javascript 中包含csrf_token

这是他们在主页中添加的关于如何添加 csrf 令牌的信息

sending - 在发送每个文件之前调用。获取 xhr 对象和 formData 对象作为第二个和第三个参数,因此您可以修改它们(例如添加 CSRF 令牌)或添加其他数据。

你明白我的问题吗?给我一些想法吗?

【问题讨论】:

【参考方案1】:

您可以查看CSRF exempt:

from django.views.decorators.csrf import csrf_exempt

class YourView(models.View):

    @csrf_exempt
    def dispatch(self, *args, **kwargs):
        return super(YourView, self).dispatch(*args, **kwargs)       

JavaScript 配置可能类似于以下内容:

(function($)
    $(function()
      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');

    function csrfSafeMethod(method) 
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    

    $.ajaxSetup(
        crossDomain: false,
        beforeSend: function(xhr, settings) 
            if (!csrfSafeMethod(settings.type)) 
                xhr.setRequestHeader("X-CSRFToken", csrftoken);
            
        
    );
  );
)(jQuery);

【讨论】:

以上是关于如何在 django 中应用 csrf_token的主要内容,如果未能解决你的问题,请参考以下文章

30_Django中关于使用ajax发送请求中`csrf_token`的问题和解决

如何在 jinja2 模板引擎中进行 csrf_token 保护?

将它们分开时将 Django 的 csrf_token 放入 Vuejs

django中csrf_token处理方式

Django,Ajax提交csrf_token处理

django:csrf_token 用于单个页面上的多个表单和 ajax 请求