修复类以在Flask会话中存储对象

3 投票
1 回答
5148 浏览
提问于 2025-04-18 08:33

我有一个自定义的类叫做 Passport,这个类里面存储了当前用户的身份和权限。之前我把它放在会话里,像这样:

p = Passport()
p.do_something_fancy()
session["passport"] = p

这样用着没问题。但现在,服务器升级后,我收到了这个错误:

TypeError: <userman.Passport instance at 0x7f06e9356f38> is not JSON serializable

我猜这个问题和 Flask 的一些升级有关,现在需要把对象转换成 JSON 格式才能存放在会话里。那么,怎样才能正确地把一个对象转换成 JSON 格式呢?也许我需要提供一个方法来进行转换,还有一个方法来恢复对象的状态,以便在再次加载时能够还原它?

1 个回答

3

你需要创建一个自定义的 JSONEncoder 类,并告诉 Flask 使用这个类来处理 JSON 的转换,也就是把数据变成 JSON 格式和从 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

撰写回答