【问题标题】:Sending POST request with JSON data in DJANGO and response from view also JSON data but its giving 403 FORBIDDEN error在 DJANGO 中发送带有 JSON 数据的 POST 请求,并从视图中响应 JSON 数据,但它给出 403 FORBIDDEN 错误
【发布时间】:2015-10-26 19:47:45
【问题描述】:

我正在尝试向 Django 发送一个带有 JSON 数据的 POST 请求,并且视图正在返回带有 JSON 数据的响应。但是当我向它发送请求时,它返回 403 Forbidden 错误。我正在使用RESTClient 发送/测试 POST 请求。

我已阅读文档中有关 CSRF 的所有内容,但它不是很有帮助。我对 Django 很陌生,这里发布的其他问题对我没有多大帮助。

我认为的代码是:

from django.shortcuts import render
from django.http import HttpResponse;
import json;
def index(request):
        if request.is_ajax():
            if request.method == 'POST':
                print 'Raw Data: "%s"' % request.body;
                reply = json.loads(request.body);
                return HttpResponse(reply);
            else:
                return HttpResponse("OK");

        else:
            return HttpResponse("OK");

【问题讨论】:

    标签: python json django


    【解决方案1】:

    除了@ArpitGoyal 的回答,您还可以使用csrf_exempt 装饰您的视图:

    此装饰器将视图标记为不受中间件确保的保护。

    如果您确实需要 CSRF 保护,请提供一些提示:

    1. 检查 CSRF 令牌 cookie 名称。

      更多信息请参见CSRF_COOKIE_NAME

    2. ensure_csrf_cookie 装饰器添加到您的视图中。

      根据the docs

      警告

      如果您的视图未呈现包含csrf_token 模板标签的模板,则 Django 可能不会设置 CSRF 令牌 cookie。这在表单被动态添加到页面的情况下很常见。为了解决这种情况,Django 提供了一个视图装饰器来强制设置 cookie:ensure_csrf_cookie()

    3. 假设 CSRF 令牌 cookie 名称为 csrftoken,尝试发送 X-CSRFToken 标头。

      $.ajax({
          // Your options here.
          headers: {'X-CSRFToken': getCookie('csrftoken')}
      });
      

    【讨论】:

      【解决方案2】:

      您应该在发出请求之前验证您的客户端。从您的电话中,您提供了一个 ajax POST 请求命中。

      在您的RESTClient 中提供headerX-CSRFToken

      更多详情请查看this

      【讨论】:

      • 假设我使用 FireFox 的 RESTClient 来测试服务,我应该在 header 中添加什么?
      猜你喜欢
      • 2019-01-06
      • 2021-10-07
      • 1970-01-01
      • 2014-03-18
      • 2018-04-24
      • 1970-01-01
      • 2014-06-06
      相关资源
      最近更新 更多