Python 3 JSON 序列化 class / 会话?

Python 3 JSON serialize class / session?

错误信息:

Object of type User is not JSON serializable

这似乎意味着我需要“序列化”用户对象,但不知道如何。

Python3个代码:

class User:
    def __init__(self, t_email, t_security_level):
        self.t_email = t_email
        self.t_security_level = t_security_level
        
def userClearSession(t_which="user_current"):
    t_email = ""
    t_security_level = ""
    user_instance = User(t_email, t_security_level)
    if t_which == "user_current":
        session["user_current"] = user_instance
    else:
        session["user_edit"] = user_instance
    return
    
@app.route('/', methods=['GET', 'POST'])
@app.route('/userRegister', methods=['GET', 'POST'])
def index(t_title="Login or Register", t_message=""):
    if "user_current" not in session:
        userClearSession(t_which="user_current")
    return render_template(
        "userRegister.html",
        t_title=t_title,
        dict_user_current=session["user_current"]
        )

Flask/Jinja2HTML模板文件:

[snip]
Email: {{ dict_user_current["t_email"] }}
Security Level: {{ dict_user_current["t_security_level"] }}
[snip]

同样的错误:

[snip]
Email: {{ session["user_current"].t_email }}
Security Level: {{ session["user_current"].t_security_level }}
[snip]

想法?

您正在尝试将 Python 对象存储在 Flask session 中。我不熟悉它的实现,但你得到的错误暗示有一个序列化到 JSON 某处。

将 Python 对象序列化为 JSON 是一种 non-trivial 追求,在这种情况下是不必要的。

一种更简单的方法是将 User 的标识符存储在 session 中,并在每次请求时使用它来检索 User 对象。替换

session["user_current"] = user_instance

session["user_current"] = user_instance.id

并重新定义您的 User class 以从您的存储中获取用户数据并将其 return 提供给您。例如,

class User():
    def __init__(email=None, security_level=None):
        self.email = email
        self.security_level = security_level

    def save():
        # logic to store your User's data in your database of choice
        self.id = save_user(self.email, self.security_level)

    def get_from_id(id):
        # logic to retrieve your user's data from your database of choice
        email, security_level = get_user_from_id(id)

        self.id = id
        self.email = email
        self.security_level = security_level

        return self

现在,要在您的会话中从 id 创建一个 User,您将调用 user_instance = User().get_from_id(session["user_current"])。调用 current_user.email 检索电子邮件地址。

如果需要 session-based 身份验证,请查看 Flask-Login