Flask-wtf:在我发布表单之前,csrf_token 已从会话中删除

2024-03-26

我使用 Flask 和 Flask-Security(特别是关于我的 csrf 问题的 Flask-WTF)来“简化”用户注册/登录的过程(到目前为止并不容易)。我在前端使用 BackboneJS,因此我有点破解了使用 Flask-WTF 的原始方法。事实上,我在 /register 上发出 AJAX GET 请求来获取注册页面(由 Flask-Security 生成),并将生成的 HTML 放入模式中。

render: function () {
            var self = this;
            $.ajax({
                type: 'GET',
                url: Config.constants.serverGateway + "/register"
            }).done(function(result){
                console.log("get register done", result);
                var html = self.template({ config: Config, form: result });
                self.$el.html(html);
            }).fail(function(error){
                console.log("Could not get register token", error);
                var html = this.errorTemplate({ config: Config });
                self.$el.html(html);
            });

            return this;
        }

这样我就有了生成的 csrf,当我发布注册数据时,我会发送正确的 csrf 以及用户数据(电子邮件和密码)。

submit: function () {
            console.log("submit");
            var self = this;
            var formData = this.$el.find('form').serialize();
            $.ajax({
                type: 'POST',
                url: Config.constants.serverGateway + "/register",
                data: formData,
                dataType: 'json'
            }).done(function(result){
                self.trigger('close');
            }).fail(function(error){
                console.log("Could not submit register data", error);
            });
        }

在服务器端,我可以调试我的python代码,看到当我请求注册页面时生成的csrf_token已经从会话对象中消失,因此导致生成一个新的,这当然没有将我发送的表格与我的表格相匹配。但会话仍然相同,因为 GET 和 POST 期间的 _id 是相同的。

您可以在flask_wtf/csrf.py::generate_csrf()中看到代码,该代码是在flask_security/views.py中的::register函数中创建表单对象时调用的

if 'csrf_token' not in session:
    session['csrf_token'] = hashlib.sha1(os.urandom(64)).hexdigest()

这会导致 CSRF TOKEN MISSING 错误。

附加信息是,我的前端和后端由同一台服务器提供,因为它们具有不同的端口号。

最后,当我在前端使用 href 并显示服务器在“GET”请求上返回的页面时,提交表单效果很好。我只是喜欢以模式显示此注册表单。

感谢您的帮助


好吧,我终于找到了解决我的问题的方法。我感觉自己像个菜鸟(我就是)。

问题在于会话凭据没有随请求发送到服务器,因此服务器无法访问会话 cookie。 我在以下教程中找到了解决方案:http://backbonetutorials.com/cross-domain-sessions/ http://backbonetutorials.com/cross-domain-sessions/为了发送它,我在主干路由器初始化函数中添加了以下几行:

// Use withCredentials to send the server cookies
// The server must allow this through response headers
$.ajaxPrefilter( function( options, originalOptions, jqXHR ) {
    options.xhrFields = {
        withCredentials: true
    };
});

这使得所有 AJAX 请求都包含withCredentials = true。在服务器端,我必须设置Access-Control-Allow-Credentials:true。由于我使用的是flask-cors,所以它是用[supports_credentials=True][2]创建 CORS 对象时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flask-wtf:在我发布表单之前,csrf_token 已从会话中删除 的相关文章

  • 基于 Pandas 中的管道分隔列创建多个新列

    我有一个 pandas 数据框 其中有一个管道分隔的列 其中包含任意数量的元素 称为 零件 这些管道串中的元素数量从 0 到超过 10 个不等 所有管道串中包含的唯一元素的数量并不比行数小很多 这使得我无法在创建新列 对于每一行 我想创建一
  • 如何编译Python 1.0

    出于某种反常的原因 我想尝试Python 1 0 我将如何编译它 或者更确切地说 可以使用当前编译器干净地编译的早期版本是什么 我使用的是 Mac OS X 10 5 不过因为这只是出于好奇 关于语言如何变化 所以在 Linux 虚拟机中编
  • ImportError:尝试在没有已知父包的情况下进行相对导入[重复]

    这个问题在这里已经有答案了 我正在学习使用 python 编程 并且在从包中的模块导入时遇到问题 我正在使用 Visual Studio 代码和 Python 3 8 2 64 位 我的项目目录 https i stack imgur co
  • 在 Django 中处理 subprocess.call()

    我正在开发的应用程序的简单想法是用户给出 Linux 命令 Linux 命令的结果将显示在网络浏览器中 这是我的观点 py from django shortcuts import render to response from djang
  • 使用 jQuery 中止 Ajax 请求

    是否有可能使用 jQuery 我取消 中止 Ajax 请求我还没有收到回复 大多数 jQuery Ajax 方法都会返回 XMLHttpRequest 或等效的 对象 因此您可以使用abort 请参阅文档 中止方法 http msdn mi
  • 对自定义类进行排序而不使用“key”参数?

    您可以对数组进行排序myclass通过使用key论证sorted功能 sortedlist sorted myclasses key lambda obj obj myproperty 有没有办法为我们的班级定义自然顺序 也许有一些神奇的方
  • 如何从 Django 中的 ModelForm 手动创建选择字段?

    我有一个ModelForm其中字段之一 名为creator is a ForeignKey 因此对于 form creator Django 渲染
  • Python 中的类位于不同的文件中吗?

    与 Java 或 php 非常相似 我习惯将类与文件分开 Python 中也是同样的情况吗 另外 我应该如何命名该文件 像classname py一样小写还是像ClassName py一样 如果我想从此类创建一个对象 我是否需要做一些特殊的
  • 使用 Pyodbc + UnixODBC + FreeTDS 设置连接设置

    我使用 Pyodbc UnixODBC 和 FreeTDS 进行了设置 但在其中的某个地方设置了一些选项 但我不知道在哪里 根据 SQL Server Management Studio 我的程序在打开连接时发送一些设置 set quote
  • Google CoLab 中的 Python 3 支持

    我一直在尝试使用 Jupyter 笔记本https colab research google com https colab research google com 并且默认情况下它们似乎运行 Python 2 7 有什么方法可以在 Co
  • 枚举列表中的列表

    我有一个约会 并记录了那天发生的事件 我想枚举显示日历的日期的事件列表 我还需要能够从列表中删除事件 def command add date event calendar if date not in calendar calendar
  • Numpy - 两个矩阵的行之间的协方差

    我需要计算两个不同矩阵的每一行之间的协方差 即第一个矩阵的第一行与第二个矩阵的第一行之间的协方差 依此类推 直到两个矩阵的最后一行 我可以在没有 NumPy 的情况下使用下面附加的代码来完成此操作 我的问题是 是否可以避免使用 for 循环
  • 如何提取数字(以及比较形容词或范围)

    我正在用 Python 开发两个 NLP 项目 它们都有类似的任务提取数值和比较运算符来自句子 如下所示 greater than 10 weight not more than 200lbs height in 5 7 feets fas
  • 利用“写入时复制”将数据复制到 Multiprocessing.Pool() 工作进程

    我有一点multiprocessingPython 代码看起来有点像这样 import time from multiprocessing import Pool import numpy as np class MyClass objec
  • 如何在 Robot Framework 中将变量定义为具有列表值的字典

    在我的一个测试用例中 我需要定义一个字典 其中键是字符串 值是字符串数组 我怎样才能在机器人框架中做到这一点 我第一次尝试使用如下所示的构造 但行不通 Variables Dictionary A StringA1 StringA2 B S
  • 如何在 python 解释器 shell 中重复最后一个命令?

    如何重复上一条命令 常用键 向上 Ctrl 向上 Alt p 不起作用 他们创造出无意义的人物 ve kakarukeys localhost ve python Python 2 6 6 r266 84292 Nov 15 2010 21
  • 使用scrapy到json文件只得到一行输出

    好吧 我对一般编程很陌生 并且具体使用 Scrapy 来实现此目的 我编写了一个爬虫来从 pinterest com 上的 pin 获取数据 问题是我以前从我正在抓取的页面上的所有引脚获取数据 但现在我只获取第一个引脚的数据 我认为问题出在
  • 为什么“模型尚未加载”?

    我正在尝试使用 customUser 安装 django registration redux 我已将其包含在我的 settings py 中 AUTH USER MODEL app customUser 注册表位于目录 registrat
  • 如何在 nltk 中使用 hunpos 标记文本文件?

    有人可以帮我解决在 nltk 中标记语料库的 hunpos 语法吗 我要导入什么hunpos HunPosTagger module http nltk googlecode com svn trunk doc api nltk tag h
  • Python TDD 目录结构

    Python 中是否有用于 TDD 的特定目录结构 教程讨论测试的内容 但不讨论测试的位置 通过研究 Python Koans 怀疑它是这样的 project main program py This has main method sta

随机推荐