2 votes

Compteur Flask pour un jeu

Je crée un jeu sur Flask et je veux avoir un compteur pendant toute la session. J'ai rassemblé un pseudo code pour la structure générale du projet. Fondamentalement, c'est un script qui tire une question aléatoire d'une base de données, collecte l'entrée de l'utilisateur, renvoie la réponse correcte, puis recommence à l'itinéraire de l'entrée de l'utilisateur. Je veux ajouter un compteur qui apparaîtra indépendamment de la fonction de l'itinéraire. J'ai regardé les sessions Flask, mais c'était confus où ou comment mettre en œuvre... des idées / suggestions? Sessions ou autrement?

get_db_info():
    connecte à une base de données

@app.route('/questions')
def user_input():
    collecte l'entrée de l'utilisateur et la met dans une variable

@app.route('/answers')
def results():
    si l'entrée de l'utilisateur = résultats:
        print(correct!)
    elif:
        print(incorrect)
    rend à nouveau à user_input()

2voto

lhk Points 1429

Vous avez déjà mentionné sessions, je pense qu'ils sont la solution à votre problème :

Flask-Session est une extension pour Flask qui ajoute la prise en charge des Sessions côté serveur à votre application.

Voici un exemple de comment faire cela avec une session. Il stocke trois compteurs, un pour les accès totaux à l'application et deux pour les accès aux routes individuelles. Si vous appelez /A trois fois puis /B, cela vous donnera

accédé à B 1 fois, accès à l'application 4 fois

from flask import Flask, session
from flask_session import Session

app = Flask(__name__)
# Vérifiez la section Configuration pour plus de détails
SESSION_TYPE = 'filesystem'
app.config.from_object(__name__)
Session(app)

@app.route('/')
def reset():
    session["counterA"]=0
    session["counterB"]=0
    session["counterTotal"]=0

    return "tous les compteurs ont été réinitialisés"

@app.route('/A')
def routeA():
    if not "counterA" in session:
        session["counterA"]=0

    if not "counterTotal" in session:
        session["counterTotal"]=0

    session["counterA"]+=1
    session["counterTotal"]+=1

    return "accédé à A {} fois, accès à l'application {} fois".format(session["counterA"], session["counterTotal"])
@app.route('/B')
def routeB():
    if not "counterB" in session:
        session["counterB"] = 0

    if not "counterTotal" in session:
        session["counterTotal"] = 0

    session["counterB"] += 1
    session["counterTotal"] += 1

    return "accédé à B {} fois, accès à l'application {} fois".format(session["counterB"], session["counterTotal"])

if __name__ == '__main__':
    app.run()

La session se comporte comme un dictionnaire et est disponible sur toutes les routes. Vous pouvez simplement y mettre votre compteur.

Pour des raisons de complétude, une solution sans sessions est également possible : En principe, les routes flask se comportent exactement comme des fonctions python. Ainsi, ce qui suit fonctionnera :

counter = 0
@app.route('/questions')
def user_input():
    global counter
    print(counter)
    counter+=1

@app.route('/answers')
def results():
    global counter
    print(counter)
    counter+=1

Je déconseille l'utilisation des variables globales, elles peuvent rendre votre code très difficile à lire et ne sont pas sûres en termes de threads.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X