为什么 Flask 会话的值必须是 JSON 可序列化的?

2024-01-21

我正在尝试在 Flask 应用程序中为用户会话实例化一个基本模型实例。我对我的类必须是 JSON 可序列化的要求感到措手不及。我认为会话字典只是存储会话信息的任意构造,但听起来它的使用有更多限制,其中之一显然是 JSON 可序列化的值。还有哪些其他约束以及此 JSON 约束的确切目的是什么?对于 Web 应用程序来说,通过 JSON 持久保存其用户会话是一个很难的期望吗?这个要求从何而来/受到启发?

@app.route( '/' , methods=['GET', 'POST'] )
def index():
    """index  takes user to the home page of the application.
    """

    # Create model instance for this user session
    if 'model' not in session :
        session['model'] = Model( )


File "C:\Anaconda3\lib\site-packages\flask\json.py", line 83, in default
return _json.JSONEncoder.default(self, o)
File "C:\Anaconda3\lib\json\encoder.py", line 173, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <Model.Model object at 0x000000000770B6D8> is not JSON serializable

只是为了额外的背景,会话对象看起来是一个 LocalProxy 实例,它可能有助于了解事物的设计。

>>> type( session )
<class 'werkzeug.local.LocalProxy'>

好的,Miguel Grinberg 对此有一些很好的评论烧瓶车间 https://youtu.be/DIcpEg77gdE?t=8835在 Pycon 2015 上。对 JSON 支持的需求与此会话数据的持久保存位置有关,即作为客户端上的 cookie。因此,数据必须序列化以弥合服务器和客户端之间的差距。按照他的说法...

所以 Flask 支持这个会话对象,...在任何路由函数中 在处理请求时,您将会话称为字典。 你写的任何内容都会被记住,下次你可以查找它 它会在那里并且是特定于用户的。

如果你有兴趣知道它是如何工作的,这是 Flask 的内部结构,你向这本字典写入的任何内容,Flask 都会放入 cookie 中并 它将发送给客户端。所以这将被存储在客户端的 网页浏览器。它将是一个经过加密签名的 cookie, 确保用户不会篡改它,并且没有 可能发生攻击。您可以看到 cookie 中的内容,但看不到 修改它。默认情况下,Flask 将数据本身写入 cookie 中,并且 该 cookie 会发送给客户端。许多其他框架的用途 默认不同。基本上他们所做的就是将数据写入 服务器中的文件或数据库,然后他们写入一个带有 标识该数据的 id,然后将 id 发送到 曲奇饼。所以 Flask 默认发送 cookie 中的全部数据 无需在服务器中存储任何内容。

因此,在我的特定情况下,为了解决这个问题,我必须实现一个 JSONEncoder 并首先对其进行编码,然后再将其传输到我的会话

<<Model.py>>
class ModelEncoder( JSONEncoder ) :
    def default( self , obj ) :
        if isinstance( obj , Model ):
            return obj.to_json()
        # Let the base class default method raise the TypeError
        return json.JSONEncoder.default( self , obj )

class Model( JSONEncoder ) :
    ....
    def to_json( self ) :
        """
        to_json transforms the Model instance into a JSON string
        """
        return jsonpickle.encode( self )


<<FlaskApp.py>>
    ...
    # Create model instance for this user session
    if 'model' not in session :
        session['model'] = ModelEncoder().encode( Model( ) )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Flask 会话的值必须是 JSON 可序列化的? 的相关文章

随机推荐

  • 如何将多个 SQL 查询合并为一个? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有多个 sql 查询 我想将它们捆
  • 将列转置为行 oracle

    我有一个以这种形式返回的查询值 查询返回超过 50 列 1 99transval 100 200transval 200 300transval 1 99nontransval 100 50 90 80 67 58 对于行值 我希望将这些详
  • 从查询字符串中的令牌授权 AWS API Gateway 请求

    我已经使用 Cognito 授权者设置了 API 网关 该授权者可以使用标头中的 id 令牌正确授权任何请求 当请求基于 XHR 时这很好 因为我可以在准备请求时添加标头 但是我在使用时无法添加这个
  • 显示多个图像动画

    我想显示一个背景图像和多个向下移动的图像 就像 降雪 场景一样 我该怎么做 背景图像不应该移动 只有它上面的小图像应该掉落 我该怎么做 更新 gt 我已在屏幕上显示图像 但它们都是同时出现的 但我想显示在不同时间出现的图像 我该怎么做 嘿
  • 如何将数据库从 SQL Server 2005 迁移到 2008?

    我想完全或部分迁移数据库 现在我要做一个完整的数据库 部分将作为单独的问题发布 我正在考虑的策略 复制数据库向导 将 2005 数据库转换为脚本 在 2008 年运行脚本 简单的SQL查询 我的问题 我想使用方法 2 是否可以这样做 如果是
  • 使用 Rcpp 将循环从 R 转换为 C++

    我想使用 Rcpp 提高一些 R 代码的速度 然而我对C 的了解却很少 因此 我检查了 Rcpp 提供的文档 以及 Dirk Eddelbuttel 网站上提供的其他文档 阅读完所有内容后 我尝试执行一个用 R 编写的简单循环 不幸的是 我
  • 如何用Javascript轻松监听xhr请求?

    我正在开发一个 Firefox 扩展 我想知道页面何时发起 xhr 请求 我看到了一些代码 但它们非常大 有没有简单的示例可以实现此目的 我正在测试这段代码 function TracingListener this receivedDat
  • Angular 2如何分别加载2个App根组件

    是否可以加载 2 个不同的根组件 不是在页面中并排 找一个笨蛋的例子 http plnkr co edit XSJ8ac 唯一的区别是两个根组件都加载在单个页面中
  • 有没有一种快速、简单的方法来转储 MacOS X 钥匙串的内容?

    我正在寻找一种方法将 OS X 钥匙串的内容转储 导出 到我可以在其他地方轻松处理的文件中 例如制表符分隔的纯文本或类似的内容 钥匙串访问应用程序不提供任何此类功能 获取钥匙的数据需要依次打开每个钥匙串 并且每次都必须输入钥匙串的密码才能查
  • 占位符文本溢出:省略号在 IE10 中不起作用

    如果占位符中的文本长度较长 我使用下面的代码显示省略号 它在 Chrome 和 Firefox 中运行良好 在 IE 中它不起作用 input placeholder text overflow ellipsis 我遇到了同样的问题并遇到了
  • 如何在 MySQL innoDB 中重建索引并更新统计信息?

    我有使用 MS SQL 服务器的经验 它是可能且有用的 and 重建索引 https msdn microsoft com en us library ms189858 aspx 我在MySQL innoDB中找不到这样的选项 有这样的选项
  • CRAN 提交 - R CMD 检查警告 - 使用编译标志

    我正在尝试将我的第一个包裹提交至CRAN在我的机器上 我在运行时收到以下警告R CMD check via RStudio checking compilation flags used WARNING Compilation used t
  • C# NetCDF 库

    我目前正在从事 或至少正在计划 几个需要处理大量重复数据的项目 这种数据在电子表格或数据库中运行良好 但在 XML 中却很糟糕 NetCDF 似乎是一个不错的文件格式选择 但是 我的工作是使用 C 进行的 并且没有可用的 官方 NetCDF
  • 我可以从 Eclipse 视图中删除重复的运行配置吗?

    我有 Maven 父项目和孩子 当我去运行 gt 运行配置 in Java应用程序我两次看到很少的启动器 唯一的区别是路径Common选项卡 部分另存为 共享文件 我什至无法在不重命名第二个的情况下重命名其中一个 有没有办法至少隐藏两个同名
  • 具有可选参数的方法

    有没有一种方法可以使方法可以接受参数 但也可以在没有参数的情况下调用 在这种情况下 参数被视为nil像下面这样 some func variable some func def some func variable nil end
  • AngularJS 主页的多个 ng-views

    好吧 我是 Angluar 的新手 刚刚开始使用 ngRoute 和 ngView 指令 我遇到了一些对我来说是问题的问题 但我怀疑这只是一个问题 因为我缺乏 Angluar 的经验 我的 index html 页面上有以下标记 简化 di
  • Mercurial MSSCCAPI 提供商?

    有人知道 Mercurial 的 MSSCCAPI 提供商吗 我想使用 PowerBuilder 尝试 Kiln Mercurial 但 PowerBuilder IDE 只识别 MSSCCAPI 提供程序 即not与 MS SCC Pac
  • Microsoft Edge 请求后退/前进按钮上的新页面

    单击后退和前进按钮时 最新版本的 Microsoft Edge 浏览器 41 162 会请求新页面 我在多个平台上测试了多个浏览器 只有 Edge 表现出这种行为 这是一个测试页 http www easynotecards com sta
  • aws sagemaker模型训练中是否有某种持久的本地存储?

    我用aws sagemaker做了一些实验 从S3下载大数据集的时间是非常有问题的 特别是当模型仍处于开发阶段 并且你想要某种相对较快的初始反馈时 是否有某种本地存储或其他方式来加快速度 EDIT我指的是批量训练服务 它允许您以 Docke
  • 为什么 Flask 会话的值必须是 JSON 可序列化的?

    我正在尝试在 Flask 应用程序中为用户会话实例化一个基本模型实例 我对我的类必须是 JSON 可序列化的要求感到措手不及 我认为会话字典只是存储会话信息的任意构造 但听起来它的使用有更多限制 其中之一显然是 JSON 可序列化的值 还有