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。
错误信息:
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。