当前位置: 首页 > 面试题库 >

在Django中通过AJAX发布参数时,“ CSRF令牌丢失或不正确”

阎扬
2023-03-14
问题内容

我尝试发布参数像

 jQuery.ajax(
        {
            'type': 'POST',
            'url': url,
            'contentType': 'application/json',
            'data': "{content:'xxx'}",
            'dataType': 'json',
            'success': rateReviewResult 
        }
    );

但是,Forbidden 403. CSRF verification failed. Request aborted. 我正在使用Django返回'django.middleware.csrf.CsrfViewMiddleware',找不到在不影响安全性的情况下如何防止此问题。


问题答案:

你可以通过两种不同的方式发出AJAX发布请求:

告诉你的视图不要检查csrf令牌。这可以通过使用decorator来完成@csrf_exempt,如下所示:

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def your_view_name(request):
    ...

要将csrf令牌嵌入每个AJAX请求中,对于jQuery,它可能是:

$(function () {
    $.ajaxSetup({
        headers: { "X-CSRFToken": getCookie("csrftoken") }
    });
});

该getCookie函数从cookie检索csrf令牌的位置。我使用以下实现:

function getCookie(c_name)
{
    if (document.cookie.length > 0)
    {
        c_start = document.cookie.indexOf(c_name + "=");
        if (c_start != -1)
        {
            c_start = c_start + c_name.length + 1;
            c_end = document.cookie.indexOf(";", c_start);
            if (c_end == -1) c_end = document.cookie.length;
            return unescape(document.cookie.substring(c_start,c_end));
        }
    }
    return "";
 }

另外,jQuery 有一个用于访问cookie 的插件,类似这样:

// set cookie
$.cookie('cookiename', 'cookievalue');
// read cookie
var myCookie = $.cookie('cookiename');
// delete cookie
$.cookie('cookiename', null);


 类似资料:
  • 问题内容: 在这里是Django的初学者,我已经尝试了很长时间了。我的中间件类中确实有“ django.middleware.csrf.CsrfViewMiddleware”,并且我的帖子中确实有令牌。 这是我的代码,我在做什么错? 这是我的模板: 问题答案: 你应该使用自动使用的快捷功能 使用https://docs.djangoproject.com/en/2.2/topics/http/sh

  • 问题内容: 我正在使用Django 1.7和django-rest-framework。 我制作了一个API,该API返回了一些JSON数据,并将其放入了我的 settings.py 当我进行GET调用时,它将返回我所有的数据,但是当我尝试使用PUT / PATCH时,我得到: 仅当我登录时才会发生这种情况,如果我是匿名用户,则可以正确进行PUT / PATCH。 我尝试过,但遇到错误,我将设置包

  • 问题内容: 我有Django的1.3版。我尝试按照其他人的问题指定localhost:8000,但这对我不起作用。我正在尝试使用文件上传表单,但是我收到一个错误,即form.py没有CSRF令牌。 form.py: views.py: upload.html: 我很沮丧,请告诉我一些尝试的方法。谢谢 问题答案: 你需要传递 为此:(views.py) 这会将csrf的令牌传递到模板。

  • 问题内容: 希望有人向我展示如何使用Django REST框架使用JSON发出简单的POST请求。我在本教程中的任何地方都看不到任何示例吗? 这是我要发布的角色模型对象。这是一个全新的角色,我想添加到数据库中,但出现500错误。 这是我在bash终端提示符下的curl请求: 网址 DOES可以处理GET请求,并且我可以下拉数据库中的所有角色,但是似乎无法创建任何新的Roles。我没有权限设置。我在

  • 我正在开发一个应用程序与Django后端和Next.js前端。我试图使用提取API将数据从前端发布到后端。我有问题传递一个有效的CSRF令牌在我的POST数据到Django。 我试图通过在POST请求中包含一个X-CSRFToken头并使用Django文档中推荐的JavaScript Cookie库获取其值来实现这一点。 这是我的提取请求: 我从Django那里得到的错误当然是说没有设置CSRF

  • 问题内容: 我有使用mod_wsgi在apache服务器上运行的django,以及由apache(而不是django)直接提供服务的angularjs应用。我想对django服务器进行POST调用(运行rest_framework),但csrf令牌存在问题。 是否可以通过某种方式从服务器设置令牌而不将其作为模板的一部分放置(因为这些页面没有经过django)? 我希望能够通过GET请求以cooki