【问题标题】:Update global dictionary/list from within an @app.route in Flask从 Flask 中的 @app.route 更新全局字典/列表
【发布时间】:2020-02-22 21:00:06
【问题描述】:

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

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”,因为字典中没有插入任何内容,因此没有任何内容可供选择或访问。

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

【问题讨论】:

    标签: python session flask cs50 flask-session


    【解决方案1】:

    由于这一行,这里正在生成关键错误:

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

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

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

    【讨论】:

    • 谢谢你。我有它,如果 GET 方法上的 dict 为空,则会呈现一个普通的 html,这就是它的作用。但是,在应该将信息添加到字典的 POST 方法之后,似乎没有添加此信息,所以我收到错误,因为字典仍然是空的。我不知道为什么字典没有更新?
    • 哦,我明白了。 index.html 中
      标签的 action 属性是什么?它是否指向索引路由(“/”)本身?因为如果它指向登录路由,则不会添加用户,因为它没有在登录函数内部实现?
    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    相关资源
    最近更新 更多