Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 修复类以启用Flask会话中的对象存储_Python_Flask - Fatal编程技术网

Python 修复类以启用Flask会话中的对象存储

Python 修复类以启用Flask会话中的对象存储,python,flask,Python,Flask,我有一个自定义类Passport,其中包含活动用户标识和权限。我以前在会话中存储它,如下所示: p = Passport() p.do_something_fancy() session["passport"] = p 它只是起作用了。现在,在服务器升级后,我收到以下错误: TypeError: <userman.Passport instance at 0x7f06e9356f38> is not JSON serializable TypeError:不可序列化JSON 我

我有一个自定义类Passport,其中包含活动用户标识和权限。我以前在会话中存储它,如下所示:

p = Passport()
p.do_something_fancy()
session["passport"] = p
它只是起作用了。现在,在服务器升级后,我收到以下错误:

TypeError: <userman.Passport instance at 0x7f06e9356f38> is not JSON serializable
TypeError:不可序列化JSON

我猜它与Flask中的一些升级有关,这些升级现在要求对象可以JSON序列化以存储在会话中。但是如何正确地使对象JSON可序列化?也许我必须提供一个序列化方法和一个反序列化方法,以便在再次加载时恢复对象状态?

您必须创建一个自定义的
jsonecoder
类,并告诉Flask将其用于JSON序列化/反序列化

以下是它的大致工作原理:

from flask.json import JSONEncoder

class CustomJSONEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Passport):
            # Implement code to convert Passport object to a dict
            return passport_dict
        else:
            JSONEncoder.default(self, obj)

# Now tell Flask to use the custom class
app.json_encoder = CustomJSONEncoder

是的,会话序列化器切换到JSON格式,以最大限度地减少攻击者在服务器端机密被泄露时可能造成的伤害。以前使用的pickle格式会让攻击者在你的服务器上执行任意代码,如果它掌握了秘密的话;不过,这个问题是重复的。谢谢,连接一个定制的JSONEncoder类修复了它。我该如何处理这篇文章?删除它?另外,我很好奇,Flask如何知道如何从JSON字符串恢复对象状态?默认情况下,它只是将字典值复制到对象字段吗?这不是上面链接的问题的副本--这个问题是关于在一个烧瓶会话中存储对象的,上面的Q&a没有解决这个问题。不幸的是,出于某种奇怪的原因,这个问题被标记为一个相关但不同的问题的副本,我只能留下评论。无论如何,flask不仅需要编码,还需要解码来正确存储对象。如果类没有提供任何易受攻击的函数(这可能是一个安全问题),我们可以使用
jsonpickle
library生成单行编码和解码对象,以便在Flask会话中正确使用它们。谢谢,这可以完成其中的一半。然而,对于完整的解决方案,我还需要钩子解码。我找到了,但这与烧瓶无关。我已经发现做
app.json_decoder=customjsondeconder
并不能达到目的。我自己也没有做过,但根据Flask API文档设置
app.json_decoder
Flask.json.jsondeconder
的子类应该可以达到目的。您遇到的确切问题是什么?我得到了“ItsDanger.BadPayload”错误(BadPayload:无法加载负载,因为在取消序列化数据时发生异常)。它对理解错误没有太大帮助;pdb.set_trace()在反序列化代码中查找错误所在,看起来反序列化程序中有错误。也可以启用调试日志记录。这不会导致调试输出发生任何更改。这个错误在我的代码中没有触发,它在更深的地方,在itsDanger.py中。我开始觉得连接自定义JSONECODER和JSONDecoder不是正确的生活方式。我想我将把封装passport数据编码/解码in session变量的代码放在一个单独的类中,该类位于应用程序范围内,并在必要时连接到会话。