Skip to content Skip to sidebar Skip to footer

Flask - Typeerror: Object Of Type Cycle Is Not Json Serializable

I'm trying to return a json response from server to client after client makes a post via AJAX. Like this, it works: @app.route('/test', methods=['GET', 'POST']) @login_required def

Solution 1:

I figured out the trouble.

Check out the following function:

@app.route("/test", methods=["GET", "POST"])deftest():
    if request.is_xhr:
        try:

            licycle = cycle(files)
            nextelem = next(licycle)

            _dict = {
                "sid": session["_id"],
                "licycle": licycle,
                "nextelem": nextelem,
                "licycle2": licycle2,
                "nextelem2": nextelem2,
                "mon_id": _id,
                "sch_id": 0
            }

            ifnot"all_submons"in session:
                session["all_submons"] = [_dict]
            else:
                session["all_submons"] = session["all_submons"] + [_dict]

            session.modified = True

            all_submons.setdefault("sub_mons", []).append(_dict)

            json_response = {"result": "success"}

        except Exception as e:
            err = _except(line=sys.exc_info()[-1].tb_lineno, error=e, function_name=what_func(), script_name=__file__)
            json_response = {"result": "failure", "err": err}
        finally:
            try:
                print("exiting...")
            except Exception as e:
                passreturn jsonify(json_response)

    else:
        return redirect("/not-found")

    return""

The reason is that type of licycle variable is <class 'itertools.cycle'> and session "probably doesn't accepts" that type of variable like a dictionary accepts as you can see in my all_submons dict variable.

The point is:

The execution DOESN'T FALLS in exception. And _dict is stored on session as you can see to next.

print(f"Session before: {session}")
print(f"all_submons before: {all_submons}")

ifnot"all_submons"in session:
    session["all_submons"] = [_dict]
else:
    session["all_submons"] = session["all_submons"] + [_dict]

session.modified = True

all_submons.setdefault("sub_mons", []).append(_dict)

print(f"Session after: {session}")
print(f"all_submons after: {all_submons}\n")

You can check the output:

Session before: <SecureCookieSession {'_fresh': True, '_id': 'e253a950...', 'all_submons': [], 'user_id': '1'}>

all_submons before: {}

Session after: <SecureCookieSession {'_fresh': True, '_id': 'e253a...', 'all_submons': [{'sid': 'e253a95...', 'licycle': <itertools.cycle object at 0x7fc989237280>, 'nextelem': ('1a4add0f275c7275.jpg',), 'licycle2': None, 'nextelem2': None, 'mon_id': 1, 'sch_id': 0}], 'user_id': '1'}>

all_submons after: {'sub_mons': [{'sid': 'e253a...', 'licycle': <itertools.cycle object at 0x7fd6f1a17b80>, 'nextelem': ('1a4add0f275c7275.jpg',), 'licycle2': None, 'nextelem2': None, 'mon_id': 1, 'sch_id': 0}]}

I'm not sure about session "probably doesn't accepts" that type of variable - <class 'itertools.cycle'>

But I created other dictionary with others variables, without type of itertools.cycle and it worked.

Post a Comment for "Flask - Typeerror: Object Of Type Cycle Is Not Json Serializable"