如何制作一个接受POST数据的Djangorestframeworkapi?

2024-06-09 03:05:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Django Rest框架api构建一个Django应用程序。 下面是我构建的一个API。我希望能够从我的浏览器发布数据。我想从我的数据库中检索一个对象模型,它具有URL中给定的匹配主对象。我想根据浏览器发布的数据对检索到的对象进行操作。如果我能用我的ViewSet从中获取发布的数据,我就可以了。但我不知道在我发布POST时如何执行viewset的update()函数。在

从我的网址.py文件:

router.register(r'replyComment', views.ReplyComment, base_name="replyComment")

从我的视图.py文件:

^{pr2}$

我正在Chrome浏览器中使用高级Rest客户端(ARC)工具。当我使用POST方法将ARC工具指向http://127.0.0.1:3001/api/replyComment/2/时,我得到错误:

{
    detail: "CSRF Failed: CSRF token missing or incorrect". 
}

请参阅屏幕截图here。我的帖子好像做错了什么。有人能告诉我怎么正确地做这件事吗?我怎样才能避开我的CSRF问题?我是Django Rest框架的新手。所以如果你能提供清楚的细节,我将不胜感激。请让我知道我需要做什么样的改变,以确保我的职位工作如我所愿?我需要更多的帮助,而不是简单地让我参考手册。(我试过了,但还是没能成功)


Tags: 文件工具数据对象djangopy框架rest
3条回答

看到有效载荷上方的Headers字段了吗?在

尝试添加以下内容:

{"X-CSRFToken": "gZvnzSFeGp7h68WjCzmFky6wMkiJZXDU"}

我看了屏幕截图,眯起眼睛试图读出你在服务器上设置的CSRF令牌。所以可能是错的,再对照你的设置.py文件。Bibhas是正确的,但是这是如何在浏览器中使用ARC完成POST的。在

Django中需要CSRF令牌来防止CSRF(跨站点请求伪造)。对于写东西的方法(POST、PUT、DELETE等),您需要在请求中包含CSRF令牌,以便Django知道请求来自您自己的站点。在

您可以在Django-rest-framework documentation中阅读更多信息。正如它在doc中所说,您可以找到如何在Django documentation中的HTTP报头中包含CSRF令牌。在

嗯。其他答案是正确的。但我想你的问题是你不知道如何使用这些答案。在

这里有一个例子。假设我想通过PUT方法发送一个带有jqueryajax函数的字段name(更新模型上的名称)。在

首先,我们应该从cookies服务器发送给我们的csrf-token。来自django documentation的函数执行以下操作(从cookie获取一些值):

// using jQuery
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;
}

当我们发送put请求时,我们将在请求头中发送csrf令牌

^{pr2}$

请注意,在beforeSend中,我设置了X-CSRFToken,因此csrf令牌在请求头中被发送。在

当然,您应该更改url和{}。在

相关问题 更多 >