Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么';除非我重新启动Flask服务器,否则我的列表不会从数据库刷新中填充吗?_Python_Sqlite_Flask - Fatal编程技术网

Python 为什么';除非我重新启动Flask服务器,否则我的列表不会从数据库刷新中填充吗?

Python 为什么';除非我重新启动Flask服务器,否则我的列表不会从数据库刷新中填充吗?,python,sqlite,flask,Python,Sqlite,Flask,我有一个非常简单的flask应用程序,它允许我注册用户名,然后在列表中显示这些用户名。我可以注册,但列表将是空的。如果我重新启动flask服务器,名称将在页面加载时显示。我尝试关闭/重新打开数据库,调用函数(populateuserlist)刷新列表,并在html中禁用浏览器缓存,但都没有效果。任何帮助都将不胜感激 app.py login.html 登记 选择用户 {{form.csrf_token} {{form.currentuser} register.html 回去 输入您的姓

我有一个非常简单的flask应用程序,它允许我注册用户名,然后在列表中显示这些用户名。我可以注册,但列表将是空的。如果我重新启动flask服务器,名称将在页面加载时显示。我尝试关闭/重新打开数据库,调用函数(populateuserlist)刷新列表,并在html中禁用浏览器缓存,但都没有效果。任何帮助都将不胜感激

app.py

login.html


登记
选择用户
{{form.csrf_token}
{{form.currentuser}


register.html


回去
输入您的姓名
{{form.hidden_tag()}}
{{form.RegisterName}



你不应该在web应用程序中使用这样的全局值,它会让你面对各种不稳定的行为。此功能:

def populateuserlist():
    conn = sqlite3.connect('users.db')
    c = conn.cursor()
    c.execute("SELECT * FROM users")
    userlist = c.fetchall()
    conn.close()
    return userlist 
对全局
userlist
名称不执行任何操作。为什么要这样做?在本地函数作用域中创建新名称。我故意跳过了
global
的使用,您不应该试图使用它。您可以使用以下工具轻松测试范围问题:

a = [1, 2, 3]

def something():
    a = [2, 3, 4]
    return a

something()
print(a)
因此,当应用程序启动时,
userlist
(全局)仅评估一次。相反,您需要在视图中调用
populateuserlist
(应该相应地重命名,因为它不填充全局名称)。该问题也以您的形式出现。您需要动态更新选项列表

@app.route('/login', methods=['GET', 'POST'])
def login_page():
    form = RegisterNameForm()
    if form.validate_on_submit():
        newuser=request.form.get("RegisterName")
        conn = sqlite3.connect('users.db')
        c = conn.cursor()
        c.execute("INSERT OR IGNORE INTO users VALUES (?)", (newuser,))
        conn.commit()
        conn.close()

    form = selectuserform()
    userlist = populateuserlist() # CHANGED HERE
    form.currentuser.choices = [(user[0], user[0]) for user in userlist] # ADD THE NEW OPTIONS (IF ANY)

    return render_template('login.html', userlist=userlist, form=form)

我添加了userlist=populateuserlist(),但它仍然没有刷新。我还在下面添加了print(userlist),控制台确实反映了数据库和userlist值正在正确更新,但下拉列表没有反映更改。感谢您对全局变量和局部变量的出色解释,我对python非常陌生。populateuserlist函数的更合适名称是什么?@Bob最后一部分很简单
get\u userlist()
是一个更好的名称,但是让我再次检查一下代码,因为我可能遗漏了前面的内容end@Bob知道了。给我几分钟时间编辑,我确实错过了something@Bob已编辑但未测试。让我知道这是否工作得很好,感谢您对函数命名的深入了解。
def populateuserlist():
    conn = sqlite3.connect('users.db')
    c = conn.cursor()
    c.execute("SELECT * FROM users")
    userlist = c.fetchall()
    conn.close()
    return userlist 
a = [1, 2, 3]

def something():
    a = [2, 3, 4]
    return a

something()
print(a)
@app.route('/login', methods=['GET', 'POST'])
def login_page():
    form = RegisterNameForm()
    if form.validate_on_submit():
        newuser=request.form.get("RegisterName")
        conn = sqlite3.connect('users.db')
        c = conn.cursor()
        c.execute("INSERT OR IGNORE INTO users VALUES (?)", (newuser,))
        conn.commit()
        conn.close()

    form = selectuserform()
    userlist = populateuserlist() # CHANGED HERE
    form.currentuser.choices = [(user[0], user[0]) for user in userlist] # ADD THE NEW OPTIONS (IF ANY)

    return render_template('login.html', userlist=userlist, form=form)