GVKun编程网logo

django中使用jquery ajax post数据出现403错误的解决办法(两种方法)

15

想了解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中使用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 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 配置

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+JQuery+Ajax+Post 方案中的问题及解决

## 遇到的问题

  • 请求发送后,服务端无响应
    Django 对于 POST 请求会检查请求来源,表单方式提交时:

    • 在 Form 内添加 {% csrf_token %} 标签;
    • request 响应函数前,添加 @csrf_exempt ;
  • 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+JQuery+Ajax+Post方案中的问题及解决

##遇到的问题

  • 请求发送后,服务端无响应
    Django对于POST请求会检查请求来源,表单方式提交时:

    • 在Form内添加 {% csrf_token %} 标签;
    • request响应函数前,添加 @csrf_exempt ;
  • 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方案中的问题及解决的相关知识,请在本站搜索。

本文标签: