django中关于json请求的403消息

Posted

技术标签:

【中文标题】django中关于json请求的403消息【英文标题】:403 message on json request in django 【发布时间】:2012-07-15 11:04:31 【问题描述】:

我正在运行 django 服务器,当我发帖时收到 403 消息。我的问题是,要进行如下所示的 json 调用,我应该运行 apache 吗?否则,我做错了什么?

html 页面中,我只包含了最新的 jquery 文件。

 var snddata = ;
  snddata["username"] = username;
  snddata["firstname"] = firstname;
  snddata["lastname"] = lastname;
  snddata["usertype"] = $("#usertype").val();
  snddata["address"] = address;
  snddata["emailid"] = emailid;
  snddata["empid"] = empid;
  $.post("/home/", snddata, 
     function callbackHandler(data, textstatus) 
     
     if (data.status == 1)
     
        alert("User added successfully");
     
     else 
     
        alert(data.msg);
     
     , 
     "json"
     );

【问题讨论】:

【参考方案1】:

Django 具有 csrf 保护,您必须为每个 POST 请求放置“csrfmiddlewaretoken”。 尝试添加这行代码:

snddata["csrfmiddlewaretoken"] = $('input[name=csrfmiddlewaretoken]').val();

你必须在你的表单中插入这个标签,它会返回一个带有 csrf_token 的隐藏输入字段:

% csrf_token %

【讨论】:

但是我在 /home 中没有看到请求我已经定义了 def home(request): logging.debug("Got request") 我所以看不到上面的调试语句我应该包括任何js文件进行json调用 包含这个后仍然是同样的问题 以这种方式设置snddata["csrfmiddlewaretoken"] 将不起作用,因为模板标签返回的是表单输入元素,而不是所需的标记。 对不起,模板标签 % csrf_token % 是对的,它返回一个带有 csrf 令牌的隐藏输入 我添加了 js 并将 csrf_token 添加到我的 html 中,但我仍然收到 403 错误。还能缺少什么?我应该把它作为一个单独的问题吗?【参考方案2】:

补充 Alasdair 所说的话。

在 html 页面的某处添加% csrf_token %。并在上面的javascript中添加snddata["csrfmiddlewaretoken"] = $("#csrfmiddlewaretoken").val();

这应该添加一个以 CSRF 令牌作为值的“输入”元素。而js部分会以表单的形式提交。

POST 请求需要 CSRF 令牌,除非视图具有 @csrf_exempt 装饰器或 CSRF 已被禁用。

响应码 403 是 Forbidden 请求码。

【讨论】:

willfill 更新了他的答案。应该是$('input[name=csrfmiddlewaretoken]').val();【参考方案3】:

403 错误是因为 Django 的跨站点请求伪造保护 (CSRF) 保护。

请参阅Django CSRF docs page 了解更多详细信息,其中包括一个有用的 sn-p,您可以使用它来使 jQuery ajax 请求工作。

【讨论】:

但是我在 /home 中没有看到请求我已经定义了 def home(request): logging.debug("Got request") 我所以没有看到上面的调试语句 我是否应该包含任何 js 文件来进行 json 调用 您的带有调试语句的视图永远不会被调用,因为 CSRF 中间件首先检查令牌,然后返回 403。 你能告诉我我想在模板中做什么,即html文件..我在html文件中没有表格,但我确实包含了snddata [“csrfmiddlewaretoken” ] = "% csrf_token %";还是同样的问题 以这种方式设置snddata["csrfmiddlewaretoken"] 将不起作用,因为模板标签返回表单输入元素,而不是所需的标记。包括我链接到的文档中包含的 ajax sn-p。您可以将其放在单独的 js 文件中,或将其包含在模板中 <script> 标记的顶部。

以上是关于django中关于json请求的403消息的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 Django 收到 403 POST 请求错误?

Django 在发送 POST 请求时返回 403 错误

django post请求 403错误解决方法

django post请求 403错误解决方法

Django - 使用 ExtJS 发布 ajax 请求禁止 403

django rest + axios put请求错误403