0

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

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

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

我每次都收到“KeyError”,因为字典中没有插入任何内容,因此没有任何内容可供选择或访问。

我试图避免使用数据库,我真的很想弄清楚这一点,我不知道我做错了什么。该代码在烧瓶应用程序之外运行得非常好,这就是它令人沮丧的原因。

4

1 回答 1

0

由于此行,此处正在生成关键错误:

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

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

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

于 2019-10-27T05:30:11.333 回答