You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask入门项目故障:SQLite数据库文件无法更新

解决Flask+SQLite待办应用注册数据无法写入数据库的问题

兄弟,我扫了一遍你的代码,立刻就发现了几个核心问题——尤其是路由那块的疏漏,这就是数据库始终为空的根本原因!咱们一步步来捋:

1. 最致命的疏漏:路由里根本没调用注册函数

你的/signup路由在处理POST请求时,只是获取了表单里的用户名和密码,但完全没调用你写的注册模型函数啊!相当于你拿到了用户输入,却没告诉程序要把这些数据存进数据库,表自然一直是空的。

而且还有个小坑:你的路由函数和注册模型函数同名(都叫signup),这会导致命名冲突,模型函数会被路由函数覆盖,就算你调用了也会出问题。先把模型函数改个名字,比如add_user,然后修改路由代码:

@app.route('/signup', methods = ['GET', 'POST'])
def signup():
    if request.method == 'GET':
        message = 'Please sign up!'
        return render_template('signup.html', message = message)
    else:
        username = request.form['username']
        password = request.form['password']
        # 调用修改后的注册函数,接收返回提示
        result = add_user(username, password)
        # 根据结果处理页面跳转或提示
        if result:
            # 用户已存在,返回注册页并显示提示
            return render_template('signup.html', message = result)
        # 注册成功才跳转到待办页面
        return render_template('todo.html')

2. 修复注册函数的SQL注入风险与连接泄漏

你现在用字符串格式化拼接SQL语句,不仅容易被SQL注入攻击,要是用户名/密码里有单引号,直接就会导致SQL执行失败。而且原来的代码在用户已存在的分支里,没关闭数据库连接,会造成连接泄漏。

改成用SQLite的参数化查询+with语句自动管理连接,既安全又省心:

def add_user(username, password):
    with sqlite3.connect('to_do_list.db', check_same_thread = False) as connection:
        cursor = connection.cursor()
        # 用?作为占位符,避免SQL注入
        cursor.execute("SELECT password FROM users WHERE username = ?;", (username,))
        exist = cursor.fetchone()
        if exist is None:
            cursor.execute("INSERT INTO users(username, password) VALUES(?, ?);", (username, password))
            connection.commit()
        else:
            return 'User already exists!'

用with包裹数据库连接的话,代码块结束后会自动关闭连接,不用手动调用close(),再也不会漏关连接了。

3. 额外验证:确认表结构正确

你说表已经生成,建议用DB Browser for SQLite这类工具打开to_do_list.db,检查users表的结构:

  • 确认id是主键且设置了自增
  • 确认username和password是VARCHAR(32)类型
  • 看看有没有意外生成了多个同名表(比如重复执行Schema代码导致的)

按上面的步骤修改后,注册数据应该就能正常写入数据库了!

内容的提问来源于stack exchange,提问作者Pfigz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:14:17