在第二个浏览器选项卡中打开Django 1.10应用程序会刷新CSRF令牌。这会破坏第一个选项卡中的所有表单 - 即,之前打开的表单无法再提交,因为旧的CSRF令牌现在无效。
如何避免此行为?
分步示例:
一些细节:
我真的想在应用程序中允许多标签浏览。
Django 1.10 release notes记录了CSRF机制的变化:
为防止BREACH攻击,现在提供CSRF保护机制 在每个请求上更改表单标记值(同时保持一个 不变秘密,可用于验证不同的令牌)。
Django' 1.9 CSRF documentation对可用性问题有很好的描述。此段落已在1.10 CSRF documentation中删除,但它似乎描述了我遇到的确切问题:
为什么不为每个请求使用新令牌?
从UI生成每个请求的新令牌是有问题的 透视,因为它使以前的所有表格无效。大多数用户 会很不高兴地发现,您的网站上打开一个新的标签具有 使他们刚刚在另一个人填写的表格无效 选项卡或他们通过后退按钮访问的表单不能 填写完毕。
答案 0 :(得分:0)
如果在视图中使用@csrf_protect装饰器,请尝试使用@csrf_exempt装饰器。
在 views.py 之前:
from django.views.decorators.csrf import csrf_protect
@csrf_protect
def view(request):
# Render Something
views.py 之后:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def view(request):
# Render Something
很抱歉收到的回复太晚。 迟到总比没有希望好。