Python 3.x会话,类和序列化

问题描述

编辑:我想知道您是否认为问题可能是我试图将数据库返回的整个字典行存储在会话变量中?

这是错误(完整的错误打印输出在这文章底部):

TypeError: Object of type User is not JSON serializable

仅供参考:我在代码中的任何地方都没有使用JSON。

这是我的代码(main.py)的相关部分:

class User():
    def __init__(self,t_id_user=None,t_email=None):
        self.t_id_user = t_id_user
        self.t_email = t_email

    def create_or_update(self,t_create_or_edit="Edit"):
        #How necessary are the "=None" below?
        #self.t_id_user = userCreate(self,t_email=None):
        #How necessary are the "=None" above?
        if t_create_or_edit == "Create":
            self.t_id_user = userCreate(
                self.t_email
                )
        else:
            self.t_id_user = userUpdate(
                self.t_id_user_edit,self.t_email
                )

    def get_from_id(self,t_id_user):
        # logic to retrieve your user's data from your database of choice
        myData = usersGet(
            t_id_user="0",t_email=""
            )
        self.t_id_user = myData["t_id_user"]
        self.t_email = myData["t_email"]
        return self

def userClearSession(t_which="user_current"):
    logging.debug("Start of userClearSession()")
    t_id_user = "0"
    t_email = ""
    user_instance = User(t_id_user,t_email)
    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','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_message=t_message,t_js="userRegister.js",t_title=t_title
        )

def userCreate(t_which="current"):
    id_user = 0
    db_cursor = data_cursor()
    q = ""
    q += "INSERT INTO tbl_users "
    q += " ( "
    q += " i_security_level"
    q += ",t_email"
    q += " ) "
    q += " VALUES "
    q += " ( "
    q += " %(t_security_level)s"
    q += ",'%(t_email)s'"
    q += " ) "
    try:
        if t_which == "current":
            user_instance = session["user_current"]
        else:
            user_instance = session["user_edit"]
        vars = {
            't_security_level': int(session["user_instance"].t_security_level),'t_email': AsIs(session["user_instance"].t_email)
            }
        db_cursor.execute(q,vars)
    except Exception as e:
        t_message = "Error"
    else:
        id_found = userIsInDB(session["user_instance"].t_email)
        if id_found >= 1:
            t_id_user = id_found
            if t_which == "current":
                session["user_current"].t_id_user = t_id_user
            else:
                session["user_edit"].t_id_user = t_id_user
        t_message = "User Created"
    db_cursor.close()
    db_conn.close()

完整的错误消息: 我很难从此错误消息中获取任何含义,需要帮助。它似乎没有指向main.py的任何部分,尽管我知道错误在那里,而且我敢肯定我将其范围缩小到了上面看到的代码

File "C:\Python\python38\Lib\site-packages\flask\app.py",line 2464,in __call__
return self.wsgi_app(environ,start_response)
File "C:\Python\python38\Lib\site-packages\flask\app.py",line 2450,in wsgi_app
response = self.handle_exception(e)
File "C:\Python\python38\Lib\site-packages\flask\app.py",line 1867,in handle_exception
reraise(exc_type,exc_value,tb)
File "C:\Python\python38\Lib\site-packages\flask\_compat.py",line 39,in reraise
raise value
File "C:\Python\python38\Lib\site-packages\flask\app.py",line 2447,in wsgi_app
response = self.full_dispatch_request()
File "C:\Python\python38\Lib\site-packages\flask\app.py",line 1953,in full_dispatch_request
return self.finalize_request(rv)
File "C:\Python\python38\Lib\site-packages\flask\app.py",line 1970,in finalize_request
response = self.process_response(response)
File "C:\Python\python38\Lib\site-packages\flask\app.py",line 2269,in process_response
self.session_interface.save_session(self,ctx.session,response)
File "C:\Python\python38\Lib\site-packages\flask\sessions.py",line 378,in save_session
val = self.get_signing_serializer(app).dumps(dict(session))
File "C:\Python\python38\Lib\site-packages\itsdangerous\serializer.py",line 166,in dumps
payload = want_bytes(self.dump_payload(obj))
File "C:\Python\python38\Lib\site-packages\itsdangerous\url_safe.py",line 42,in dump_payload
json = super(URLSafeSerializerMixin,self).dump_payload(obj)
File "C:\Python\python38\Lib\site-packages\itsdangerous\serializer.py",line 133,in dump_payload
return want_bytes(self.serializer.dumps(obj,**self.serializer_kwargs))
File "C:\Python\python38\Lib\site-packages\flask\json\tag.py",line 305,in dumps
return dumps(self.tag(value),separators=(",",":"))
File "C:\Python\python38\Lib\site-packages\flask\json\__init__.py",line 211,in dumps
rv = _json.dumps(obj,**kwargs)
File "C:\Python\python38\Lib\json\__init__.py",line 234,in dumps
return cls(
File "C:\Python\python38\Lib\json\encoder.py",line 199,in encode
chunks = self.iterencode(o,_one_shot=True)
File "C:\Python\python38\Lib\json\encoder.py",line 257,in iterencode
return _iterencode(o,0)
File "C:\Python\python38\Lib\site-packages\flask\json\__init__.py",line 100,in default
return _json.JSONEncoder.default(self,o)
File "C:\Python\python38\Lib\json\encoder.py",line 179,in default
Open an interactive python shell in this frameraise TypeError(f'Object of type {o.__class__.__name__}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)