谁遇到过post请求时发生403forbidden
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谁遇到过post请求时发生403forbidden相关的知识,希望对你有一定的参考价值。
参考技术A 因为django针对提交的请教,有校验。所以会如此。导入模块
from django.views.decorators.csrf import csrf_exempt
在函数前面添加修饰器
@csrf_exempt
[python] view plain copy
#客户端提交的post如果不加这段,会出现403error
@csrf_exempt
def api_blogs(request):
if request.method == 'POST' and request.POST['page']:
int_page = int(request.POST['page'])
else:
int_page = 1
blogs = dbBlog.objects.order_by('-created_date').all()
page_size = 10
after_range_num = 5
before_range_num = 6
paginator = Paginator(blogs, page_size)
try:
blogs = paginator.page(int_page)
except(EmptyPage, InvalidPage, PageNotAnInteger):
blogs = paginator.page(1)
try:
return_json = serializers.serialize('json',blogs.object_list)
except :
return_json =
'status': 1,
'msg' '提取blog异常'
return HttpResponse(
return_json
)
解决 Ajax 发送 post 请求出现 403 Forbidden 的三种方式
众所周知前端向后台发送 post 请求时,必须验证 csrf
,否则会报错 403 Forbidden
。使用 Django Form 表单可以直接在表单里面添加 % csrf_token %
即可,要是通过 Ajax 发送请求又该怎么办?下面提供三种解决办法:
<ul id="ddd">
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<button id="btn" type="button">Ajax 发送</button>
1. 方式一
<script src="% static 'js/jquery-3.1.1.js' %"></script>
<script>
$('#btn').click(function ()
var li_content = [];
$('#ddd').children('li').each(function ()
li_content.push($(this).html());
);
console.log(li_content);
$.ajax(
url: '/webs/test_json/',
type: 'post',
data:
'li_list': JSON.stringify(li_content),
csrfmiddlewaretoken: ' csrf_token ' // 添加这句
,
success: function (arg)
console.log(arg);
)
)
</script>
2. 方式二
方式二仅在 Django 中适用,因为 % csrf_token %
是 Django 的模板语言,它会生成一个隐藏的 input
标签
<ul id="ddd">
% csrf_token % <!--添加这句会生成一个隐藏的 input 标签,name='csrfmiddlewaretoken'-->
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<button id="btn" type="button">Ajax 发送</button>
<script src="% static 'js/jquery-3.1.1.js' %"></script>
<script>
$('#btn').click(function ()
var li_content = [];
$('#ddd').children('li').each(function ()
li_content.push($(this).html());
);
console.log(li_content);
$.ajax(
url: '/webs/test_json/',
type: 'post',
data:
'li_list': JSON.stringify(li_content),
csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val() // 添加这句,去获取 input 的值
,
success: function (arg)
console.log(arg);
)
)
</script>
3. 方式三
因为 cookie
中同样存在 csrftoken
,所以可以在 js
中获取:$.cooke("cstftoken")
,并将其添加到请求头中发送。
1、直接添加请求头:
$.ajax(
url: '/webs/test_json/',
headers: "X-CSRFtoken":$.cookie("csrftoken"),
type: 'post',
data:
'li_list': JSON.stringify(li_content)
,
success: function (arg)
console.log(arg);
)
)
2、如果页面有多个 Ajax,那么可以设置全局的:
发送请求前会事先执行 $.ajaxSetup()
方法,它会从 cookie
中获取 csrftoken
$.ajaxSetup(
beforeSend: function (xhr, settings)
if (!csrfSafeMethod(settings.type) && !this.crossDomain)
xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
);
$.ajax(
url: '/webs/test_json/',
type: 'post',
data:
'li_list': JSON.stringify(li_content)
,
success: function (arg)
console.log(arg);
)
3、如果想要实现在当 get
方式的时候不需要提交 csrftoken
,当 post
的时候需要,实现这种效果的代码如下:
<script src="% static 'js/jquery-3.1.1.js' %"></script>
<script type="text/javascript" src="/static/js/jquery.cookie.js"></script>
<script>
$('#btn').click(function ()
var li_content = [];
$('#ddd').children('li').each(function ()
li_content.push($(this).html());
);
console.log(li_content);
function csrfSafeMethod(method)
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
/*
全局Ajax中添加请求头X-CSRFToken,用于跨过CSRF验证
*/
$.ajaxSetup(
beforeSend: function (xhr, settings)
if (!csrfSafeMethod(settings.type) && !this.crossDomain)
xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
);
$.ajax(
url: '/webs/test_json/',
type: 'post',
data:
'li_list': JSON.stringify(li_content)
,
success: function (arg)
console.log(arg);
)
)
</script>
Tips:一定要导入
jquery.cookie.js
和jquery-3.3.1.js
文件 !!!
以上是关于谁遇到过post请求时发生403forbidden的主要内容,如果未能解决你的问题,请参考以下文章
解决 Ajax 发送 post 请求出现 403 Forbidden 的三种方式
Node.js:POST - 请求方法:OPTIONS 状态代码:403 Forbidden
从 Chrome 扩展程序获取请求导致 403 Forbidden
webpack devServer代理跨域get请求成功,post请求失败403 Forbidden