Ajax发起POST请求提示csrftoken is not defined错误如何解决
解决方案
方式1:从Cookie中自动读取(推荐,无需依赖模板渲染)
将读取Cookie的代码放在你现有csrfSafeMethod函数之前即可,完整实现如下:
// 读取指定名称Cookie的工具函数 function getCookie(name) { let cookieValue = null; if (document.cookie && document.cookie !== '') { const cookies = document.cookie.split(';'); for (let i = 0; i < cookies.length; i++) { const cookie = cookies[i].trim(); if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } // 定义csrftoken变量 const csrftoken = getCookie('csrftoken'); // 你原来的csrfSafeMethod方法 function csrfSafeMethod(method) { // 这些HTTP方法不需要CSRF保护 return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); }
Django默认会在站点Cookie中写入名为csrftoken的凭证,该方法不需要修改模板配置,适合JS代码单独作为静态文件存放的场景。
方式2:通过Django模板直接赋值(最简单,适合JS写在HTML模板内的场景)
如果你的这段JS代码直接写在Django的HTML模板文件中,只需要在调用csrftoken前新增一行赋值代码即可:
const csrftoken = '{{ csrf_token }}';
Django渲染模板时会自动将{{ csrf_token }}模板标签替换为实际的CSRF令牌值。
额外优化提示
你现有AJAX代码的data参数写法存在问题,FormData实例不能直接作为对象属性值传递,如果需要同时提交表单数据和自定义的todosDatos参数,需要将额外参数追加到FormData实例中:
$("#formTabla").submit(function(event){ event.preventDefault(); var formData = new FormData(this); // 追加自定义参数 formData.append('datos', JSON.stringify(todosDatos)); $.ajax({ beforeSend: function(xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } }, url : "{% url 'submit' %}", type: "POST", processData: false, contentType: false, // 直接传入FormData实例即可 data: formData, success: function (respuesta){ } }); });
内容的提问来源于stack exchange,提问作者xdan
相关产品推荐
相关产品推荐

