一、简介
django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。
全局:
中间件 django.middleware.csrf.CsrfViewMiddleware
局部:
@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
注:from django.views.decorators.csrf import csrf_exempt,csrf_protect
二、应用
1、普通表单
1
2
3
4
5
6
7
|
veiw中设置返回值: return render_to_response( 'Account/Login.html' ,data,context_instance = RequestContext(request))
或者
return render(request, 'xxx.html' , data)
html中设置Token: { % csrf_token % }
|
2、Ajax
对于传统的form,可以通过表单的方式将token再次发送到服务端,而对于ajax的话,使用如下方式。
view.py
1
2
3
4
5
6
7
8
9
10
|
from django.template.context import RequestContext
# Create your views here. def test(request):
if request.method = = 'POST' :
print request.POST
return HttpResponse( 'ok' )
return render_to_response( 'app01/test.html' ,context_instance = RequestContext(request))
|
text.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
<!DOCTYPE html> <html> <head lang = "en" >
<meta charset = "UTF-8" >
<title>< / title>
< / head>
<body> { % csrf_token % }
< input type = "button" onclick = "Do();" value = "Do it" / >
<script src = "/static/plugin/jquery/jquery-1.8.0.js" >< / script>
<script src = "/static/plugin/jquery/jquery.cookie.js" >< / script>
<script type = "text/javascript" >
var csrftoken = $.cookie( 'csrftoken' );
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);
}
}
});
function Do(){
$.ajax({
url: "/app01/test/" ,
data:{ id : 1 },
type : 'POST' ,
success:function(data){
console.log(data);
}
});
}
< / script>
< / body>
< / html>
|
更多:https://docs.djangoproject.com/en/dev/ref/csrf/#ajax
原文地址:https://www.cnblogs.com/wupeiqi/articles/5246483.html