与Flask一起进行我的第一个婴儿项目。这是一个游戏,我的目标是将用户当前的“实时游戏”和“团队”(组)存储在session-dict中,因此我不必在每次调用路由时都运行数据库查询(我可以不会想到以其他方式优雅地“集中”存储和传递这些数据)。
因此,我在第13和14行的代码“ new_game”(附加)中进行了此操作。get_db()函数(在此处找到:https://flask.palletsprojects.com/en/1.1.x/patterns/sqlite3/)返回一个namedtuple-还附加了它的实现。 / p>
这些行导致我的调试器转储“ TypeError:无法腌制sqlite3.Row对象”。现在,我怀疑问题可能在于命名元组为类型,并用dict()封装了get_db(),但这并没有改变。 在我看来,这是对有经验的人来说非常常见的解决方案,因此非常感谢...因此对此的任何帮助/提示/背景将不胜感激! ☺️
@app.route("/new_game", methods=["GET", "POST"])
@login_required
def new_game():
# get group_name from form & initiating user's turn
if request.method == "POST":
group_name = request.form.get("group")
row = query_db("SELECT * FROM groups WHERE group_name=? AND user_id=?",[group_name, session["user_id"]], one=True)
# new DB entry for new game
get_db().execute("INSERT INTO games (active, turn, group_name) VALUES (:active, :turn, :group_name)", {"active":1, "turn":row["turn"], "group_name":row["group_name"]})
get_db().commit()
#store user's live game and group in session
session["game"] = query_db("SELECT * FROM games INNER JOIN groups ON groups.group_name=games.group_name INNER JOIN users ON users.user_id=groups.user_id WHERE users.user_id=? AND games.active=?", [session["user_id"], 1], one=True)
session["gamegroup"] = query_db("SELECT * FROM groups INNER JOIN games ON games.group_name=groups.group_name INNER JOIN users ON groups.user_id=users.user_id WHERE groups.user_id=? AND games.active=?", [session["user_id"], 1], one=True)
return render_template("live_game.html", turn=row["turn"], round=1, isturn=True, group_name=group_name)
else:
return redirect("/new_game")
###########################################
def get_db():
db=getattr(g, '_database', None)
if db is None:
db = g._database = sqlite3.connect("ce.db")
db.row_factory = sqlite3.Row
return db
def query_db(query, args=(), one=False):
cur = get_db().execute(query, args)
rv = cur.fetchall()
cur.close()
return (rv[0] if rv else None) if one else rv