首页 技术 正文
技术 2022年11月19日
0 收藏 627 点赞 3,224 浏览 5811 个字

原文网址:http://www.cnblogs.com/retop/p/4677148.html

注:本人使用的Django1.8.3版本进行测试

除了使用Django内置表单,有时往往我们需要自定义表单。对于自定义表单Post方式提交往往会带来由CSRF(跨站请求伪造)产生的错误”CSRF verification failed. Request aborted.”

本篇博客只要针对”表单提交”和”Ajax提交”两种方式来解决CSRF带来的错误

一、表单提交

Template:

?

123456789101112131415 <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>计算数字和</title> </head> <body>     <form method="post" action="{%url 'Calculate' %}">         {% csrf_token %}         <label for="A"><input id="A" name="ValueA" type="text"></label>         <label for="B"><input id="B" name="ValueB" type="text"></label>         <input type="submit" value="开始计算">     </form> </body> </html>

Views.py:

?

12345678 def Calculate(request):     if request.POST:         a=request.POST["ValueA"]         b=request.POST["ValueB"]         c=str(int(a)+int(b))         return  render_to_response('Result.html',{'result':c})     else:         return render_to_response('Calculation.html',context_instance=RequestContext(request))

需要注意:

  (1)在<form>标签内添加{% csrf_token %},这样在表单提交的过程中,会产生”csrfmiddlewaretoken”标识去防止CSRF

  (2)在Get请求页面时,需要添加context_instance=RequestContext(request) ,它和{% csrf_token %}配合使用,缺少一个都会出现上述错误,RequestContext 需要在 django.shortcuts 导入

  (3)只有当表单以Post方式提交时,才需要验证CSRF,Get方式是不需要的

二、Ajax提交

同比与表单提交,Ajax提交需要进行额外的操作,Ajax提交时需要自己提供”csrfmiddlewaretoken”标识参数。我们除了需要引入JQuery外还需要引入一段JS代码

?

123456789101112131415161718192021222324252627282930313233343536 jQuery(document).ajaxSend(function(event, xhr, settings) {     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;     }     function sameOrigin(url) {         // url could be relative or scheme relative or absolute         var host = document.location.host; // host + port         var protocol = document.location.protocol;         var sr_origin = '//' + host;         var origin = protocol + sr_origin;         // Allow absolute or scheme relative URLs to same origin         return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||             (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||             // or any other URL that isn't scheme relative or absolute i.e relative.             !(/^(\/\/|http:|https:).*/.test(url));     }     function safeMethod(method) {         return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));     }        if (!safeMethod(settings.type) && sameOrigin(settings.url)) {         xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));     } });

Template:

?

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>Ajax 提交</title>     <script type="text/javascript" src="/static/jquery.js"></script>     <script type="text/javascript">         jQuery(document).ajaxSend(function(event, xhr, settings) {     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;     }     function sameOrigin(url) {         // url could be relative or scheme relative or absolute         var host = document.location.host; // host + port         var protocol = document.location.protocol;         var sr_origin = '//' + host;         var origin = protocol + sr_origin;         // Allow absolute or scheme relative URLs to same origin         return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||             (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||             // or any other URL that isn't scheme relative or absolute i.e relative.             !(/^(\/\/|http:|https:).*/.test(url));     }     function safeMethod(method) {         return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));     }       if (!safeMethod(settings.type) && sameOrigin(settings.url)) {         xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));     } });     </script>     <script type="text/javascript">         $(function(){              $.ajaxSetup({                     data:{csrfmiddlewaretoken: '{{ csrf_token }}'}                 });                 $("#Comment").click(function(){                     $.post('{% url 'AjaxRequest' %}',{"a":$("#A").val(),"b":$("#B").val()},function(data){                        $("#result").html(data);                     });                 });         });     </script> </head> <body>     <label for="A"><input id="A" name="ValueA" type="text"></label>     <label for="B"><input id="B" name="ValueB" type="text"></label>     <input type="button" id="Comment" value="开始计算">     <h1>计算的结果为:<span id="result"></span></h1> </body> </html>

View.py:

?

12345678 def AjaxRequest(request):     if request.POST:         a =request.POST["a"]         b=request.POST["b"]         c=int(a)+int(b)         return JsonResponse(c,safe=False)     else:         return render_to_response('AjaxDemo.html',context_instance=RequestContext(request))

需要注意:

  (1)在使用引入的JS代码后,需要添加如下代码,这样JS就可以自动帮我们生成”csrfmiddlewaretoken”标识,接下来你就可以使用$.post()了

?

123 $.ajaxSetup({                    data:{csrfmiddlewaretoken: '{{ csrf_token }}'}                });

  (2)context_instance=RequestContext(request) 并不是必须的

  (3)Get请求不需要以上操作,直接使用$.get()即可

总结:本人学习Django的时间不长,写博客的目的只要是为了自己做知识记录和对知识的分享,如果哪里写的不好,还请广大博友指点,多多包涵。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,071
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,549
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,397
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,174
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,809
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,889