Python 从Flask中的@app.route中更新全局字典/列表

Python 从Flask中的@app.route中更新全局字典/列表,python,session,flask,cs50,flask-session,Python,Session,Flask,Cs50,Flask Session,我正试图找到一种方法,从flask应用程序中的函数中更新字典(全局)。 我想像这样在字典中存储创建帐户的用户的信息 user { 'key': {'key1':'value1', 'key2':'value2'} } 但我似乎无法从函数中更新dict或list。 我两个都试过了 user['key']={'key1':'value1','key2':'value2'} 及 user.update({'key':{'key1':'value1','key2':'value2') 更新的方法,但它

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

user {
'key': {'key1':'value1', 'key2':'value2'}
}
但我似乎无法从函数中更新dict或list。 我两个都试过了
user['key']={'key1':'value1','key2':'value2'}
user.update({'key':{'key1':'value1','key2':'value2')
更新的方法,但它不起作用

if __name__ == "__main__":
    app.run()
    socketio.run(app)
这是这部分的完整代码

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

if __name__ == "__main__":
    app.run()
    socketio.run(app)
我每次都会收到“keyrerror”,因为dict中没有插入任何内容,所以没有可选择或访问的内容


我正试图避免使用DB,我真的很想弄明白这一点,我不知道我做错了什么。代码在flask应用程序之外运行得非常好,这就是为什么它令人沮丧的原因。

由于这行代码,这里产生了关键错误:

if request.method == "GET":
...
    get_user = users[user_name]
这是因为当您启动Flask应用程序时,最初的“用户”字典是空的。因此,当您第一次使用“GET”方法(这是在浏览器中键入URL时的默认方法)访问这两个路由中的任何一个时,这里的这一行将生成一个键错误,因为字典是空的,并且键“user\u name”不存在。解决此问题的常用方法是使用try-except块并处理异常


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

谢谢。我有这样的功能,如果GET方法上的dict为空,将呈现一个简单的html,这就是它所做的。但是,在POST方法之后,信息应该添加到dict中,似乎没有添加这些信息,因此我得到了一个error,因为dict仍然是空的。我不明白的是为什么dict没有更新?哦,我明白了。index.html中标记的action属性是什么?它是否指向索引路由(“/”)本身?因为如果它指向登录路由,则不会添加用户,因为这在登录函数中没有实现?