【问题标题】:Django REST, sudden 403 error in ajax callDjango REST,ajax调用中突然出现403错误
【发布时间】:2016-06-04 02:02:15
【问题描述】:

我有一个基本的看法

@api_view(['POST'])
def test(request):
    id = request.POST.get("id")    
    response = {}
    try:
        obj = MyModel.objects.get(id=id)
        response['can'] = False
    except MyModel.DoesNotExist:
        response['can'] = True
    return Response(response)

在网址中

url(r'^test', test),

模板中的简单调用:

$.ajax({
        type : "POST",
        data : {id:id},
        url  : "/test/",
        success: function(data) {
            if(data['can']){
                $("#Test").show();
            } else{
                $("#Test").hide();
            }
        },
        error: function(error) {
            console.log(error);
        }
    });

而且它最近有效。但是今天,当我测试这个应用程序时,我得到了错误:

[22/Feb/2016 15:09:02] "POST /test/ HTTP/1.1" 403 58

意思是“禁止访问”。我不知道是怎么回事。也许你可以帮忙。

编辑 我刚刚注意到它发生在Firefox浏览器上。在 ubuntu 的“浏览器”和谷歌浏览器上,我没有这个 403 错误。

编辑 2 哦,当我将 firefox 作为私有/隐身窗口运行时,我没有这个 403 错误。仅当我使用“普通”Firefox 时才会出现此错误。

【问题讨论】:

    标签: ajax django django-rest-framework


    【解决方案1】:

    可能的问题:可能是之前的用户会话仍在浏览器 cookie 中。尝试清除 Firefox 浏览器的 cookie。

    下次尝试时,您可能会再次遇到该问题,因此您可以追溯为什么某些用户没有被授予权限。

    【讨论】:

      【解决方案2】:

      没有用户或任何权限。这是“未登录”用户的应用程序。

      我刚刚为 ajax 调用添加了 csrf 保护。 (来自 django 文档)

      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]);
              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) {
          return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
      }
      $.ajaxSetup({
          beforeSend: function(xhr, settings) {
              if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                  xhr.setRequestHeader("X-CSRFToken", csrftoken);
              }
          }
      });
      

      而且它的工作。我觉得对吗?这个错误是由于缺少csrf保护造成的吗?

      【讨论】:

        猜你喜欢
        • 2019-05-08
        • 2015-12-12
        • 1970-01-01
        • 1970-01-01
        • 2020-10-13
        • 2022-01-16
        • 2020-07-14
        • 2021-10-01
        • 1970-01-01
        相关资源
        最近更新 更多