Flask 2.3.x教程登录示例:SQLite数据查询返回None问题
Flask 2.3.x注册后无法登录:SQLite查询返回None的解决方法
问题根源在于注册接口执行数据库插入后未提交事务,导致数据仅存在于当前数据库连接的内存中,并未真正写入磁盘数据库。当login接口使用新连接查询时,自然无法读取到未持久化的数据。
具体修改方案
在auth/register接口的try-except-else代码块中,添加数据库提交操作:
@blueprint.route('/register', methods=('GET', 'POST')) def register(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] db = get_db() error = None if not username: error = 'Username is required' elif not password: error = 'Password is required' if error is None: try: db.execute( 'INSERT INTO user (username, password) VALUES (?, ?)', (username, generate_password_hash(password)), ) except db.IntegrityError: error = f'User {username} is already registered.' else: # 新增事务提交操作,将数据持久化到磁盘 db.commit() return redirect(url_for('auth.login')) flash(error) return render_template('auth/register.html')
原因说明
SQLite默认启用事务机制,执行INSERT/UPDATE/DELETE这类写操作后,必须调用db.commit()才能将修改从内存事务同步到磁盘数据库。你之前的代码在插入后直接跳转,close_db仅关闭连接但未提交事务——SQLite会在连接关闭时自动回滚未提交的事务,导致注册数据丢失。而注册接口内查询能看到数据,是因为同一个事务内允许读取未提交的脏数据。
内容的提问来源于stack exchange,提问作者thomaspane
相关产品推荐
相关产品推荐

