我在两个页面上有两个表单,一个表示另一个表单。如果在第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>
答案 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
。