admin管理员组

文章数量:1357389

I would like to explicitly tell to flask-session how to encode / decode some instances from classes that are specific to my application. (This is legacy code, I can not change the classes).

For example I have some classes looking like this:

class Subclass(metaclass=abc.ABCMeta):
    def __init__(self, before=None, next=None, nested_steps=None):
        self.before = before
        self.next = next
        self.nested_steps = nested_steps or []


class MyClass1(Subclass):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.number = 1
        self.name = "myclass1"

class MyClass2(Subclass):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.number = 2
        self.name = "myclass2"
        self.nested_steps = [MyClass1()]

class OverallClass:
    def __init__(self):
        self.class1 = MyClass1()
        self.class2 = MyClass2(before=self.class1)
        self.class1.next = self.class2
        self.class2.nested_steps = [self.class1]
        self.steps = [self.class1, self.class2]

I can encode /decode them myself and even use msgpack for this, following the documentation:

thedict = {"id": 1, "obj": OverallClass()}
packed = msgpack.packb(thedict, default=encode_internalClass)
unpacked = msgpack.unpackb(packed, object_hook=decode_internalClass)

This works fine for standalone serialization and deserialization. However, I am struggling to integrate this with flask_session. I think I need to overwrite the serializer of flask_session to use those encode_internalClass and decode_internalClass within my app and with jinja2 templates.

I would need this because I am using for example :


@app.route("/save_object_live")
def save_object_live():
    # Create an instance of our internal class
    overallclass = OverallClass()
    # Serialize the object and store it in the session
    session["test_local"] = overallclass
    flash("Object saved in session")
    return redirect(url_for("home"))


@app.route("/load_object_live")
def load_object_live():
    # Deserialize the object from the session
    serialized_data = session.get("test_local")
    if serialized_data:
        flash("Object loaded from session")
        return redirect(url_for("home"))
    else:
        flash("No object found in session")
        return redirect(url_for("home"))



The full stack of the application is flask, flask-session, jinja2 and mongodb.

本文标签: pythonFlask and Flask Sessionusing a adhoc decodeencode (eg with msgpack)Stack Overflow