想了解django中使用jqueryajaxpost数据出现403错误的解决办法(两种方法)的新动态吗?本文将为您提供详细的信息,此外,我们还将为您介绍关于djangopost请求403错误解决方法、
想了解django中使用jquery ajax post数据出现403错误的解决办法(两种方法)的新动态吗?本文将为您提供详细的信息,此外,我们还将为您介绍关于django post请求 403错误解决方法、django+jquery ajax post csrf 配置、Django+JQuery+Ajax+Post 方案中的问题及解决、Django+JQuery+Ajax+Post方案中的问题及解决的新知识。
本文目录一览:- django中使用jquery ajax post数据出现403错误的解决办法(两种方法)
- django post请求 403错误解决方法
- django+jquery ajax post csrf 配置
- Django+JQuery+Ajax+Post 方案中的问题及解决
- Django+JQuery+Ajax+Post方案中的问题及解决
django中使用jquery ajax post数据出现403错误的解决办法(两种方法)
在django中,使用jquery ajax post数据,会出现403的错误
方法一:
如果用jQuery来处理ajax的话,Django直接送了一段解决问题的代码。把它放在一个独立的js文件中,在html页面中都引入即可。注意这个js文件必须在jquery的js文件引入之后,再引入即可
$(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')); } });
方法二:
在处理post数据的view前加@csrf_exempt装饰符
例如
@csrf_exempt def profile_delte(request): del_file=request.POST.get("delete_file",'')
以上通过两种方法解决了django ajax post 403错误,当然解决方法也不止这两种,欢迎多多分享自己的见解,本文写的不好,还请见谅,谢谢。
django post请求 403错误解决方法
django post请求 403错误解决方法
--摘
第一次用Django做项目,遇到了很多问题。
今天遇到的问题是Django在处理post请求时多次出现403错误。
我先描述一下问题出现的环境:我用Django写了一个web服务端,姑且称它为API吧。我在实际测试中发现,通过get方式可以从API中获得数据,但是post方式却无法获取数据,客户端显示服务器端出现403错误。
我找不出什么原因,只好新建了一个表单来测试post请求,我发现通过表单发送post请求时,页面显示403错误:Forbidden CSRF verification failed. Request aborted. 我在网上查了一下,大多数人的解决方式是:在settings.py里面的MIDDLEWARE_CLASSES中加入‘django.middleware.csrf.CsrfResponseMiddleware’,我测试了一下,加入上面的代码之后,表单提交确实没有问题。但是我程序中调用API时,API仍然会返回403错误。我查了一下API中的代码,确定不是我写的代码的问题。然后我就疑惑了。不过我有一种感觉,那就是settings.py里面的MIDDLEWARE_CLASSES的配置有问题。我又在网上查了一下,有人说把‘django.middleware.csrf.CsrfViewMiddleware’,去掉可以解决post方式出现的403错误。我试了一下,还真可以。
现在总结一下解决方法:
1. 在settings.py里面的MIDDLEWARE_CLASSES中加入“‘django.middleware.csrf.CsrfResponseMiddleware’,”;
2. 在settings.py里面的MIDDLEWARE_CLASSES中去掉“‘django.middleware.csrf.CsrfViewMiddleware’,”。
如果是解决表单提交时的出现的403错误“Forbidden CSRF verification failed. Request aborted.”,上面的两种方式都可以解决,如果在其他程序里面单独通过post方式请求数据,那就只能用第二种方式解决。
另外我想补充的就是:第二种方式不需要以第一种方式为前提,也就是在去掉 “’django.middleware.csrf.CsrfViewMiddleware’,”后可以不用加入“’django.middleware.csrf.CsrfResponseMiddleware’”
django+jquery ajax post csrf 配置
django+jquery ajax post csrf 配置:
<body>
{% csrf_token %}
<script>
var csrftoken = jQuery(“[name=csrfmiddlewaretoken]”).val();
function docker_build_ver(url,pk) {
bootbox.prompt({
size: “small”,
title: “请输入版本号,如 v1.1”,
callback: function(result) {
if (result != null) {
if (ulist.length == 1 || ulist.length > 3){
bootbox.alert ({size: ‘small’, message: ‘输入的版本号不正确,请重新输入!’});
}else {
postData(url,{pk:pk ,result: result});
}
} else {}
}
});
}
function postData(url,data) {
$.ajaxSetup({
data: {csrfmiddlewaretoken: ‘{{ csrf_token }}’ },
});
$.ajax({
url: url,
data: data,
type: ‘post’,
dataType: ‘json’
}).done(function () {});
}
</scrip>
</body>
Django+JQuery+Ajax+Post 方案中的问题及解决
## 遇到的问题
-
请求发送后,服务端无响应
Django 对于 POST 请求会检查请求来源,表单方式提交时:- 在 Form 内添加
{% csrf_token %}
标签; - request 响应函数前,添加
@csrf_exempt
;
- 在 Form 内添加
-
Jquery POST 方式提交时,在服务端添加了 @csrf_exempt ,在 Django1.5 版本后,无法直接通过 POST 获取参数,通过
raw_data = request.body
获取数据时,出现如下错误提示:
Exception: You cannot access body after reading from request''s data stream
其实这个提示的意思是在获取 body 数据前,数据流已经被读过;问题就出在 @csrf_exempt 上,Django 提前对 request 做了读取验证操作,因此问题就来了:Django 服务端要接收 POST 请求,需要支持 csrf_exempt,但添加这个前置后,又无法获取 POST 参数了。
-
解决办法:不使用服务端的 @csrf_exempt 前置说明,前端添加 csrftoken,让服务端可以接收到 POST 请求。
$.ajaxSetup({ dataType: "json",
beforeSend: function(xhr, settings){
var csrftoken = $.cookie(''csrftoken'');
xhr.setRequestHeader("X-CSRFToken", csrftoken);
},
});
为 Ajax 添加预处理,保证每次 POST 请求时,自动发送 csrftoken,这样就可以在服务端正常处理 POST 数据了。
生命在于折腾~~
Django+JQuery+Ajax+Post方案中的问题及解决
##遇到的问题
-
请求发送后,服务端无响应
Django对于POST请求会检查请求来源,表单方式提交时:- 在Form内添加
{% csrf_token %}
标签; - request响应函数前,添加
@csrf_exempt
;
- 在Form内添加
-
Jquery POST 方式提交时,在服务端添加了 @csrf_exempt ,在Django1.5版本后,无法直接通过POST获取参数,通过
raw_data = request.body
获取数据时,出现如下错误提示:
Exception: You cannot access body after reading from request''s data stream
其实这个提示的意思是在获取body数据前,数据流已经被读过;问题就出在 @csrf_exempt 上,Django提前对request做了读取验证操作,因此问题就来了:Django服务端要接收POST请求,需要支持csrf_exempt,但添加这个前置后,又无法获取POST参数了。
-
解决办法:不使用服务端的@csrf_exempt前置说明,前端添加csrftoken,让服务端可以接收到POST请求。
$.ajaxSetup({ dataType: "json",
beforeSend: function(xhr, settings){
var csrftoken = $.cookie(''csrftoken'');
xhr.setRequestHeader("X-CSRFToken", csrftoken);
},
});
为Ajax添加预处理,保证每次POST请求时,自动发送csrftoken,这样就可以在服务端正常处理POST数据了。
生命在于折腾~~
今天关于django中使用jquery ajax post数据出现403错误的解决办法(两种方法)的讲解已经结束,谢谢您的阅读,如果想了解更多关于django post请求 403错误解决方法、django+jquery ajax post csrf 配置、Django+JQuery+Ajax+Post 方案中的问题及解决、Django+JQuery+Ajax+Post方案中的问题及解决的相关知识,请在本站搜索。
本文标签: