Ajax请求如何设置csrf_token
0|11. 方式一
通过获取隐藏的input标签中的csrfmiddlewaretoken值,放置在data中发送。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$.ajax({ url: "/cookie_ajax/", type: "POST", data: { "username": "yang", "password": 123, // 使用jQuery取出csrfmiddlewaretoken的值,拼接到data总 "csrfmiddlewaretoken": $("[name="csrfmiddlewaretoken"]").val() }, success: function(data){ console.log(data); }}) |
0|12. 方式二
通过获取返回的cookie中的字符串,放置在请求头中发送。
注意: 需要引入一个jquery.cookie.js插件。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$.ajax({ url: "/cookie_ajax/", type: "POST", // 从Cookie取csrftoken, 并设置到请求头中 headers: {"X-CSRFToken": $.cookie("csrftoken")}, data: { "username": "yang", "password": 123 }, success: function(data){ console.log(data) }}) |
或者用自己写一个getCookie方法:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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"); |
每一次都这么写太麻烦了,可以使用$.ajaxSetup()方法为ajax请求统一设置。
|
1
2
3
4
5
6
7
8
9
10
11
12
|
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); } }}) |
注意:
如果使用从cookie中取csrftoken的方式,需要确保cookie存在csrftoken值。
如果你的视图渲染的HTML文件中没有包含{% csrf_token %}, Django可能不会设置CSRFtoken的cookie。
这个时候需要使用ensure_csrf_cookie()装饰器强制设置Cookie。
|
1
2
3
4
5
|
django.views.decorators.csrf import ensure_csrf_cookie@ensure_csrf_cookiedef login(request): pass |

浙公网安备 33010602011771号