pythonのdjango CSRF简单使用
一、简介
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
用心做人,用脑做事!----鹏鹏张