在第二个浏览器选项卡中打开 Django 1.10 应用程序会刷新 CSRF token 。这会破坏第一个选项卡中的所有表单——即,无法再提交以前打开的表单,因为旧的 CSRF token 现在无效。

我如何避免这种行为?

分步示例:

  • 用户正在查看选项卡 A 中的表单。
  • 用户在选项卡 B 中打开应用程序。
  • 用户返回选项卡 A 并尝试提交表单。
  • 错误:禁止 (403)。 CSRF 验证失败。请求中止。

  • 一些细节:

    我真的很想在应用程序中允许多标签浏览。

    Django 1.10 release notes 记录了对 CSRF 机制的更改:



    Django 的 1.9 CSRF documentation 对可用性问题有很好的描述。这一段已在 1.10 CSRF documentation 中删除,但它似乎描述了我遇到的确切问题:

    最佳答案

    如果您在 View 中使用 @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
    

    这么晚才回复很抱歉。
    我希望迟到总比没有好。

    关于django - 打开新的浏览器选项卡会使 Django 的 CSRF token 失效,从而阻止表单提交,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43296162/

    10-13 06:43