django下ajax请求403(FORBIDDEN)的解决办法

环境

django 1.8.3

错误描述

POST http://localhost:8000/ajax_query_data/ 403 (FORBIDDEN)

解决办法

django官方文档上如下内容:

https://docs.djangoproject.com/en/dev/ref/csrf/#ajax

AJAX
While the above method can be used for AJAX POST requests, it has some inconveniences: you have to remember to pass the CSRF token in as POST data with every POST request. For this reason, there is an alternative method: on each XMLHttpRequest, set a custom X-CSRFToken header to the value of the CSRF token. This is often easier, because many JavaScript frameworks provide hooks that allow headers to be set on every request.
As a first step, you must get the CSRF token itself. The recommended source for the token is the csrftoken cookie, which will be set if you’ve enabled CSRF protection for your views as outlined above.

官方文档里面有范例,基本原理就是在post数据里面添加csrf信息

总结并试了下,将下面代码加到js文件里面问题可解决:

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({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

版权声明:本文为博主原创文章,欢迎转载,转载请注明出处。

时间: 2024-10-26 04:59:43

django下ajax请求403(FORBIDDEN)的解决办法的相关文章

demopu教你Nginx 403 forbidden的解决办法

来自:http://www.demopu.com/?p=639 常见的,引起nginx 403 forbidden有二种原因,一是缺少索引文件,二权限问题.1,缺少index.html或者index.php文件[plain]view plaincopyserver {        listen       80;        server_name  localhost;        index  index.php index.html;        root  /var/www;  

Apache2.4部署django出现403 Forbidden错误解决办法

前言:Apache部署django出现403 Forbidden错误最好要结合apache中的错误日志来观察出现何种错误导致出现403错误 下午百度了一下午没找到解决办法,试了n种方法,简直坑爹! 比如网页出现最多的解决办法是: <Directory E:/wamp/Apache24/www(你的工程路径)>           Order allow,deny           Allow from all       </Directory> 可惜这样改了后还是报403,最后

Nginx 403 forbidden的解决办法

以下是我的Nginx配置: user root; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/oct

Laravel ajax请求419错误及解决办法(CSRF验证) 阿星小栈

ajax请求报419 unknown status 解决办法1:将这个接口放到api路由上,这样可以跳过CSRF的检查 解决办法2: 1.在页面上添加 <meta name="csrf-token" content="{{ csrf_token() }}"> 2.然后在页面的script标签{{– 这句是废话,但是,啊我的博客好短不想删 – }}中添加 $.ajaxSetup({headers: {'X-CSRF-TOKEN': $('meta[name

跨域请求的概念和解决办法

相关概念 同源是指相同的协议.域名.端口,三者都相同才属于同源. 同源策略浏览器处于安全考虑,在全局层面禁止了页面加载或执行与自身来源不同的域的任何脚本,站外其他来源的脚本同页面的交互则被严格限制. 跨域由于浏览器同源策略,凡是发送请求url的协议.域名.端口三者之间任意一与当前页面地址不同即为跨域 跨域资源共享(Cross Origin Resource Sharing,CORS)是一个解决跨域问题的好办法,从而可以使用XHR从不同的源加载数据和资源. 看看哪些情况下属于跨域访问: 解决办法

IE浏览器因缓存问题未能成功向后端发送请求的几个解决办法

转自: http://blog.csdn.net/tuzongxun/article/details/51355059 这段时间前后端联调,解决IE.谷歌等浏览器兼容问题,真是让人有点焦头烂额,各种奇葩问题层出不穷,旧问题刚去,新麻烦又来,其中尤其以IE浏览器缓存的问题最多.有若干次都是因为这个缓存,使得前端的请求没有实际到达后台,造成304状态码. 经过前端同事和我的各种尝试,发现有三四种办法可以针对不同的情况解决这个问题. 方法一: 在网上一搜“html设置不缓存”就会看到大部分的答案都是这

html页面顶部出现一段空白,检查控制台发现body 下出现&amp;#65279字符,原因及解决办法

html页面顶部出现一段空白,检查控制台发现body 下出现&#65279字符,原因及解决办法 分析: 原来是页面编码时增加了BOM,此页面后端数据主要是PHP语言,对PHP来讲PHP在设计时没有考虑BOM问题,,不会忽略UTF-8编码的文件开头BOM的那三个字符,会把BOM作为该文件开头正文的一部分.由于必须在<?或者<?php后面的代码才会作为PHP代码执行,所以将会造成在页面上输出这三个字符,显示效果就要看浏览器了,一般是一个空行或是一个乱码.由于在html一开头有这3个字符的存

windows下mysql忘记root密码的解决办法

今天早上 一朋友说自己的mysql 忘记root密码了 让我帮忙给看看,因为没有接触过mysql 所以从网上找了一下信息经我亲身实践  已经成功!mysql版本是5.1以下是从网上找的信息: 1. 首先检查mysql服务是否启动,若已启动则先将其停止服务,可在开始菜单的运行,使用命令: net stop mysql 打开第一个cmd1窗口,切换到mysql的bin目录,运行命令: mysqld --defaults-file="C:\Program Files\MySQL\MySQL Serve

关于IOS由于Dropbox被封,https请求不好用的解决办法

最近研究IOS的In-House安装方法,好不容易申请下来了企业级证书,也使用了Dropbox的网盘来支持苹果的In-House安装方法,也给客户展示了,下载的地址也给客户了.没过几天,坑爹的天朝把Dropbox给封了,部署上去的下载地址全不好用了,刚刚客户给我打电话问这件事咋办,搜索了国内所有主流的网盘我也没找到既可以有直链地址的网盘又支持https的,就在灰心之际,我想起了开源中国,记得在做开源项目时,开源中国是https请求,并且可以在网页中展示出全部代码.所我马上在开源中国申请了一个账号