Как настроить уникальную базу данных для каждого посетителя моего веб-приложения Flask с помощью SQL Alchemy? - PullRequest
0 голосов
/ 11 декабря 2019

Привет, я совсем новичок в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...