Счетчик колб для игры

Я создаю игру на Flask и хочу иметь счетчик на протяжении всей сессии. Я собрал некоторый код psuedo для общей схемы проекта. По сути, это скрипт, который извлекает случайный вопрос из базы данных, собирает вводимые пользователем данные, возвращает правильный ответ, а затем снова запускает маршрут ввода данных пользователем. Я хочу добавить счетчик, который будет отображаться независимо от функции маршрута. Я смотрел на сессии Flask, но было непонятно, где или как реализовать... какие-нибудь мысли / предложения? Сеансы или иначе?

get_db_info():
    connects to a database

@app.route('/questions')
def user_input():
    collects user input and puts into variable

@app.route('/answers')
def results():
    if user input = results:
        print(correct!)
    elif:
        print(incorrect)
    renders back to user_input()

1 ответ

Решение

Вы уже упоминали сессии, я думаю, что они являются решением вашей проблемы:

Flask-Session - это расширение для Flask, которое добавляет поддержку сеанса на стороне сервера в ваше приложение.

Вот пример того, как сделать это с помощью сеанса. Он хранит три счетчика, один для общего доступа к приложению и два для доступа к отдельным маршрутам. Если вы позвоните /A три раза, а затем /B, это даст вам

Доступ к B 1 раз, доступ к приложению 4 раза

from flask import Flask, session
from flask_session import Session

app = Flask(__name__)
# Check Configuration section for more details
SESSION_TYPE = 'filesystem'
app.config.from_object(__name__)
Session(app)

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

    return "all counters were reset"

@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 "accessed A {} times, accessed app {} times".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 "accessed B {} times, accessed app {} times".format(session["counterB"], session["counterTotal"])


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

Сеанс ведет себя как словарь и доступен для всех маршрутов. Вы можете просто поставить свой счетчик там.

Для полноты картины также возможно решение без сессий: в принципе, маршруты фляг ведут себя так же, как функции python. Так что будет работать следующее:

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

Я бы не рекомендовал использовать глобальные переменные, они могут сделать ваш код очень трудным для чтения и не являются поточно-ориентированными.

Другие вопросы по тегам