【问题标题】:Django CSRF failure, using React formsDjango CSRF 失败,使用 React 表单
【发布时间】:2017-06-25 09:07:40
【问题描述】:

我在使用 Django 和 React 的 CSRF 方面遇到问题。

我已经阅读了关于这个问题的大量问题,当然还有 django 文档。我已经尝试了应该解决问题的不同事物的所有可能组合,但仍在努力解决这个问题。

首先我尝试创建一个注册页面,但是当我发布注册时/我得到 CSRF cookie not set, 403.

我已经禁用了 CSRF 中间件 [不好,我知道,只是想到达某个地方],我得到 405,方法不允许 [试图发布]。我只是想也许这是有人以前遇到过或听起来很熟悉并可以提供一些指导的事情?

我尝试过: - 添加装饰器@csrf_exempt, - 将 CSRF 添加到请求的标头中, - 附上整个饼干, - 使用令牌附加隐藏的表单字段。

我正在使用这个种子项目:https://github.com/Seedstars/django-react-redux-base 如果有人想看看,我在 React 中做了一些,但在 Django 方面并没有做很多,所以离那里不远了

【问题讨论】:

    标签: django reactjs csrf


    【解决方案1】:

    您不应该禁用 django 中的 csrf 检查。 相反,在您的表单/模板中只需执行 {% csrf_token %} 不是{{ csrf_token }} 它将打印一个隐藏的表单元素,其值已分配给您的 csrf 令牌。

    如果您使用的是 ajax,您可以简单地将您的 ajax 标头全局设置为:

    $.ajaxSetup({
            beforeSend: function (xhr, settings) {
                // this time double brackets
                xhr.setRequestHeader("X-CSRFToken", "{{csrf_token}}"); 
            }
        });
    

    如果你正在使用 fetch 那么:

    fetch('some/url/here', {
                method: 'GET',
                headers: {
                    'X-CSRFToken': window.CSRF_TOKEN // or pass it in your own way
                }
            }).then(function (response) {
                return response.json()
            })
    

    我能想到的几乎都是这些。

    希望这会有所帮助。

    【讨论】:

    • 这正是我所做的,但无济于事。当我查看请求的请求标头时,我确实注意到虽然我在代码中有'X-CSRFToken',但它显示为'x-csrftoken',但我认为这也不是问题?跨度>
    • 您使用的是什么版本的 django?你能发一份你的标题副本吗?
    • 感谢贾斯汀的回复!我将编辑帖子以包含代码,谢谢! Django 的版本是 1.8.15
    • 您修复了这个错误吗?我被困在同一个问题上。如果您可以发布您的解决方案作为答案,那就太好了。
    • 我很抱歉我现在才看到这个问题,你解决了这个问题吗?我相信我搞砸了中间件,这些东西都没有问题。如果你还在苦苦挣扎,请告诉我,我可以回顾一下我的所作所为
    猜你喜欢
    • 2012-01-10
    • 2017-01-22
    • 1970-01-01
    • 2012-09-08
    • 2012-12-27
    • 2015-06-02
    • 1970-01-01
    相关资源
    最近更新 更多