Привет, я совсем новичок в Flask и SQL Alchemy. Я пытаюсь создать веб-приложение, которое будет отслеживать результаты в игре, где пользователь добавляет результаты в веб-приложение через форму.
Для каждого посетителя страницы я бы хотел создать новую базу данных, в которой будут храниться имена игроков и текущие результаты.
Текущий код, который у меня есть, настраивает одну базу данных, что явно неверно для этого варианта использования. У меня есть код для этой части приложения:
Любая помощь по этому вопросу высоко ценится, как я уже говорил, я довольно новичок во всем этом, поэтому может упустить что-то очевидное / может быть другой способчтобы достичь того же конечного результата, который я не рассматривал.
Спасибо!
init .py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SECRET_KEY'] = ******
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.jinja_env.filters['zip'] = zip
db = SQLAlchemy(app)
db.create_all()
from scrabblescorer import routes
models.py
from scrabblescorer import db
class Player(db.Model):
"""database for storing score information"""
id = db.Column(db.Integer, primary_key=True)
player = db.Column(db.String(20), nullable=False)
score = db.Column(db.Integer, nullable=False, default=0)
def __repr__(self):
return f"Player('{self.player}', '{self.score}')"
как я взаимодействуюс БД в моем файле rout.py:
from flask import render_template, url_for, flash, redirect, session, request
from scrabblescorer import app, db
from scrabblescorer.models import Player
from scrabblescorer.forms import TwoPlayerGameForm, NewGameForm, TwoPlayerNameForm, \
ThreePlayerGameForm, FourPlayerGameForm, ThreePlayerNameForm, FourPlayerNameForm, FinalScoreForm
# Pre game class
@app.route("/", methods=['GET', 'POST'])
@app.route("/home", methods=['GET', 'POST'])
def start_game():
db.drop_all()
form = NewGameForm()
# Save the number of players to be accessed elsewhere
session['num_players'] = request.form.get('num_players')
if form.validate_on_submit():
db.create_all()
return redirect(url_for('enter_names'))
return render_template('start_game.html', form=form)
@app.route("/enter_names", methods=['GET', 'POST'])
def enter_names():
num_players = session.get('num_players', None)
if num_players == '2':
form = TwoPlayerNameForm()
elif num_players == '3':
form = ThreePlayerNameForm()
elif num_players == '4':
form = FourPlayerNameForm()
if form.validate_on_submit():
# Add player names to the database
for field in form:
if field.type == 'StringField':
player = Player(player=field.data, score=0)
db.session.add(player)
db.session.commit()
flash('Starting Game!', 'success')
return redirect(url_for('game'))
return render_template('enter_names.html', form=form)
# Mid game class
@app.route("/game", methods=['GET', 'POST'])
def game():
num_players = session.get('num_players', None)
if num_players == '2':
form = TwoPlayerGameForm()
elif num_players == '3':
form = ThreePlayerGameForm()
elif num_players == '4':
form = FourPlayerGameForm()
players = Player.query.all()
# Add latest turn scores to the database
if form.validate_on_submit():
fields = [field for field in form if field.type == 'IntegerField']
for field, player in zip(fields, players):
player.score += field.data
db.session.commit()
# Checks which button was pressed
if form.submit.data:
flash('Scores updated.', 'success')
return redirect(url_for('game'))
elif form.end_game.data:
return redirect(url_for('final_scores'))
return render_template('game.html', form=form, players=players, num_players=num_players)
# final scores
@app.route("/final_scores", methods=['GET', 'POST'])
def final_scores():
players = Player.query.all()
form = FinalScoreForm()
if form.validate_on_submit():
return redirect(url_for('start_game'))
return render_template('final_scores.html', form=form, players=players)