Работаю над моим первым детским проектом с Flask. Это игра, и моя цель - сохранить текущие «живую игру» и «команду» (группу) в сессионном диктанте, поэтому мне не нужно запускать запрос DB каждый раз, когда вызывается маршрут (могуне думаю о каком-либо другом способе «централизованного» хранения и элегантной передачи этих данных).
Так что я делаю это в моем коде «new_game» (прилагается) в строках 13 и 14. Get_db ()функция (найдена здесь: https://flask.palletsprojects.com/en/1.1.x/patterns/sqlite3/) возвращает именованный кортеж - также приложил мою реализацию этого.
Эти строки привели к тому, что мой отладчик сбросил «TypeError: не могу выбрать объекты sqlite3.Row». ТеперьЯ подозревал, что, возможно, проблема связана с namedtuple как типом и инкапсулировал get_db () с помощью dict (), но это ничего не изменило. Мне кажется, что это обычное дело с очень очевидным решением для опытных людей ... Любая помощь / советы / справки по этому вопросу будет принята с благодарностью! 100
@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