在django建站中遇到post提交表单提示403错误, 发现以Post方式提交表单会触发django内置的csrf保护机制,并且在403页面给出了解决方法,根据提示更改后发现问题依旧,网上查阅很多同学的解决方案均不能解决这个问题,所以到官网上查阅了关于csrf部分的具体设置,最后成功解决了这个问题。
官方csrf部分设置翻译:
CSRF设置步骤:
第一步: 在settings.py中的MIDDLEWARE_CLASSES部分添加'django.middleware.csrf.CsrfViewMiddleware',如果使用普通方式创建的django项目,这一项一般都已经存在了不用额外设置。
如果你不希望加入csrf的中间件,那么可以在views中的方法上加上csrf_protect()装饰器方法,这一步不是必须设置的,网上很多有很多人都在启用了中间件的同时也加上了csrf_protect()方法,导致问题依旧,官方文档上明确写到了这一步是【Alternatively】
第二步:在POST表单的template中加入csrf_token。这一步很简单,在模板中添加如下代码:
<form action="." method="post">{% csrf_token %}
需要注意的一点是,表单提交路径是如果是外部链接则不需要添加csrf token。
第三步:在请求处理方法中添加context processor。
这一步有两种方式实现:
方法1:使用RequestContext,RequestContext始终都使用了'django.core.context_processors.csrf'。 If you are using generic views or contrib apps, you are covered already, since these apps use RequestContext throughout.(这一段还没搞明白,大致意思猜想是普通views或内置的contrib下的应用时,那么已经使用了这种方式来处理csrf请求了,不需要额外处理了)
方法2:手动添加csrf处理(我使用的这一种能成功访问)。示例代码如下:
from django.core.context_processors import csrf from django.shortcuts import render_to_response def my_view(request): c = {} c.update(csrf(request)) # ... view code here return render_to_response("a_template.html", c)
在第一次按照自己的设想将如上代码加入到view中时,发现问题依旧,后来将前两行代码放置在方法开始位置后,成功解决问题,由此推测该示例代码的前两行只能放在第一次使用request对象之前。
django中使用Ajax请求的CSRF设置:
将官方文档上的ajax设置照搬下来:
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'); function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } $.ajaxSetup({ crossDomain: false, // obviates need for sameOrigin test beforeSend: function(xhr, settings) { if (!csrfSafeMethod(settings.type)) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } } });
这里使用的是jQuery,于是可以使用jQuery来正常发送ajax请求,如:
$(document).ready(function(){ $("#postBtn").click(function(){ $.post('/ajax/aPost/', {id:'0001'}, function(data){ alert(data); }) }); } );
get请求就不赘述了,同理,本文主要问题在于设置csrf说明,使用django版本为1.4.3,jQuery版本为1.8.0
相关推荐
主要介绍了Django CSRF跨站请求伪造防护过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
设置django允许跨域请求,以实现前后端的分离
Django Web框架的Curl,对Django服务器进行身份验证请求
django ajax异步请求Django的Ajax库3813428.zip
主要介绍了Django中如何防范CSRF跨站点请求伪造攻击的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Django项目打包执行教程,亲测可用,可对python文件和Django程序进行打包发布,保护源码,Django源码保护
Django消息库,用于从传输方法中分离内容
(简体中文) Python新手使用Django架站的16堂课 Python是目前很好受欢迎的程序设计语言 本书通过对Python语言使用很多的DjangoWebFramework的介绍 让读者可以轻松制作出全功能的动态网站。 本书分4部分 以16堂课来...
Django 请求与响应
用Django做的HTTP请求控制树莓派gpio口驱动L298N电机驱动板的项目文档
一种基于Vue.js和Django的权限控制方法及系统.pdf一种基于Vue.js和Django的权限控制方法及系统.pdf一种基于Vue.js和Django的权限控制方法及系统.pdf一种基于Vue.js和Django的权限控制方法及系统.pdf一种基于Vue.js和...
ztree ajax异步调用,使用django作为服务端,可正常运行。开启服务(项目根目录下,与manange.py同级, 执行python manage.py runserver开启服务),浏览器输入地址http://127.0.0.1:8000/ztree/standar/即可
本书分4部分,以16堂课来介绍Python新手使用Django架站的要点。第一部分(第1~3堂)以一个小型的个人博客网站为主轴,介绍如何快速建立一个实用的Django网站;第二部分(第4~7堂)是Django架构深入剖析,详细分析...
主要介绍了django ajax发送post请求的两种方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
第1章 Django建站基础 1 1.1 网站的定义及组成 1 1.2 网站的分类 3 1.3 网站运行原理及开发流程 5 1.4 走进Django 6 1.5 Django 2.0的新特性 7 1.6 安装Django 8 1.7 创建项目 9 1.8 PyCharm搭建开发环境 12 1.9 本...
django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django...
需求:实现ajax请求,在界面上任意地方点击,可以成功传参。 创建项目如下所示: settings.py文件的设置,这次我们除了要注册app和设置templates文件夹的路径,还要多设置一下static的路径,...from django.shortcuts
Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django...