在Flask的@ app.route中更新全局词典/列表

时间:2019-10-27 04:28:05

标签: python session flask cs50 flask-session

我正在尝试找到一种在flask应用程序中的函数内更新字典(全局)的方法。 我想在这样的字典中存储有关在帐户中创建帐户的用户的信息。

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。但是,由于我认为这是问题所在,我该如何在flask中运行每个单独的函数(例如ex,index()或signin())?我认为这应该由app.run()来处理,但是它不起作用。

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

我每次都会收到“ KeyError”,因为未在dict中插入任何内容,因此没有选择或访问的内容。

我正试图避免使用数据库,而我真的想弄清楚这一点,我不知道自己在做什么错。该代码在Flask应用程序外部运行得很好,这就是令人沮丧的原因。

1 个答案:

答案 0 :(得分:0)

由于以下原因,正在此处生成关键错误:

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

这是因为启动Flask应用程序时,最初的“用户”字典为空。因此,当您首次使用“ GET”方法(当您在浏览器中键入URL时的默认方法)访问两条路由中的任意一条时,此行将在字典中为空且关键字为key时生成KeyError “用户名不存在。解决此问题的常用方法是使用try-except块并处理Exception。

另外,这两个功能似乎都在做相同的事情,即登录用户。如果正确区分这两个功能会更好。我建议将所有登录逻辑都保留在“登录”路由中,并使用“索引”路由简单地显示登录页面。您还应该正确设置两条路线的方法。应该只能通过POST方法访问“登录”功能。