Django CSRF错误是通过以多页形式访问页面来修复的吗?

时间:2018-03-01 03:37:11

标签: python django cookies web csrf

我在两个页面上有两个表单,一个表示另一个表单。如果在第1页上按下“提交”,则应该将您带到第2页的表单。第2页失败,“CSRF验证失败。请求已中止。”原因是“未设置CSRF cookie。”

奇怪的是,如果我直接进入第2页,它会很好地加载。如果我刷新页面并重新提交表单,我会再次获得403,但是,例如,如果我进入地址栏并点击“Enter”重新访问该页面,则会加载而不会出现错误。是什么给了什么?

我使用的是最新版本的Django,我在所有视图中使用了渲染,在所有表单标记中都使用了{%csrf_token%}。

为什么重访网页会修复403错误?表单之间不会发生登录或身份验证。事实上,我甚至没有对第1页(尚未)提交的数据做任何事情。

相关代码如下:

Page 1模板:

<div class="">
    <div class="">
        <h1>Page 1</h1>
        <p>What's up?</p>
        <form action="{% url 'core:getPageTwo' %}" method="post">
            {% csrf_token %}
            {{ form }}
            <input class="yellow_button" type="submit" value="Submit">
        </form>
    </div>
</div>

Page 2查看:

def getPageTwo(request):
    form = SomeForm()
    context = {'form' : form}
    return render (request, 'core/page_two.html', context)

Page 2模板:

<div class="">
    <div class="">
        <h1>Page 2</h1>
        <form action="#" method="post">
            {% csrf_token %}
            {{ form }}
        </form>
    </div>
</div>

2 个答案:

答案 0 :(得分:0)

找到它。我的HTTPS搞砸了。因此,我有CSRF_COOKIE_SECURE = TRUE的事实搞乱了发送cookie的所有尝试。

答案 1 :(得分:0)

除了你的答案@thrillhouse:

CSRF_COOKIE_SECURE=True使csrf令牌仅适用于ssl,就像文档也说:

  

是否为CSRF cookie使用安全cookie。如果将其设置为True,则cookie将被标记为“安全”,这意味着浏览器可以确保cookie仅通过HTTPS连接发送。

因此,当您切换回HTTPS连接时,您应该将值重新设置为True