我正在尝试找到一种在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应用程序外部运行得很好,这就是令人沮丧的原因。
答案 0 :(得分:0)
由于以下原因,正在此处生成关键错误:
if request.method == "GET":
...
get_user = users[user_name]
这是因为启动Flask应用程序时,最初的“用户”字典为空。因此,当您首次使用“ GET”方法(当您在浏览器中键入URL时的默认方法)访问两条路由中的任意一条时,此行将在字典中为空且关键字为key时生成KeyError “用户名不存在。解决此问题的常用方法是使用try-except块并处理Exception。
另外,这两个功能似乎都在做相同的事情,即登录用户。如果正确区分这两个功能会更好。我建议将所有登录逻辑都保留在“登录”路由中,并使用“索引”路由简单地显示登录页面。您还应该正确设置两条路线的方法。应该只能通过POST方法访问“登录”功能。