Обновите глобальный словарь / список из @ app.route во Flask - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь найти способ обновить словарь (глобальный) из функции в приложении фляги. Я хочу хранить информацию о пользователях, которые создают учетную запись в словаре, как это.

user {
'key': {'key1':'value1', 'key2':'value2'}
}

Но я не могу обновить дикт или список изнутри функции. Я пробовал оба способа обновления user['key']={'key1':'value1', 'key2':'value2'} и user.update({'key': {'key1':'value1', 'key2':'value2'}, но он не работает.

Это полный код этой части.

channel_list = []
users = {}


@app.route("/", methods=["GET", "POST"])
def index():
    username = request.form.get("username")
    firstname = request.form.get("firstname")
    lastname = request.form.get("lastname")

    if request.method == "GET":
        if session.get("user_name"):
            user_name = session.get("user_name")
            get_user = users[user_name]
            render_template("profile.html", user_name=get_user, users=users)
        else: 
            return render_template("index.html")

    if request.method == "POST":
        session["user_name"] = username
        newuser = {username: {"username": username, "firstname": firstname, "lastname": lastname}}
        users.update(newuser)
        get_user = users[username]

    return render_template("profile.html", user=get_user, users=users)     


@app.route("/signin", methods=["GET", "POST"])
def signin():


    username = request.form.get("username")

    if request.method == "GET":
        if session.get("user_name"):
            user_name = session.get("user_name")
            get_user = users[user_name]
            render_template("profile.html", user=get_user, users=users)
        else: 
            return render_template("signin.html")

    if request.method == "POST":
        session["user_name"] = username
        get_user = users[username]

        return render_template("profile.html", user=get_user, users=users)

    return render_template("signin.html")

Я выяснил проблему, пытаясь сделать это в чистом Python, и там я тоже не могу обновить dictбез первого запуска функции. Но как мне запустить каждую отдельную функцию (ex, index () или signin ()) в фляге, потому что я думаю, что это проблема? Я думаю, что об этом должен позаботиться app.run (), но он не работает.

if __name__ == "__main__":
    app.run()
    socketio.run(app)

Я продолжаю получать "KeyError" каждый раз, потому что ничего не вставляется в dict, поэтому нет ничего, чтобы выбрать или получить доступ.

Я пытаюсь избежать использования БД, и яочень хочу понять это, я не знаю, что я делаю неправильно. Код работает очень хорошо вне приложения фляги, поэтому он расстраивает.

1 Ответ

0 голосов
/ 27 октября 2019

Здесь генерируется ключевая ошибка из-за этой строки:

if request.method == "GET":
...
    get_user = users[user_name]

Это потому, что когда вы запускаете приложение Flask, изначально словарь 'users' пуст. Таким образом, когда вы впервые обращаетесь к любому из двух маршрутов, используя метод «GET» (который является методом по умолчанию при вводе URL-адреса в браузер), эта строка будет генерировать KeyError, так как словарь пуст и ключ"Имя пользователя не существует. Распространенный способ исправить это - использовать блок try-exc и обработать исключение.

Кроме того, обе эти функции, похоже, выполняют одно и то же, то есть выполняют вход пользователя. лучше, если вы правильно различаете две функции. Я бы порекомендовал сохранить всю логику входа в маршрут входа в систему и использовать маршрут индекса для простого отображения страницы входа. Вы также должны правильно настроить методы двух маршрутов. Предполагается, что только функция 'signin' будет доступна через метод POST.

...