Flask项目用户注册信息无法写入TXT文件及相关功能故障求助
Flask用户注册信息无法写入txt文件的问题修复
问题根源拆解
你的代码存在几个关键逻辑错误,导致用户信息无法正常写入文件,同时后续登录校验也会失效:
- 注册逻辑混乱:循环读取用户文件时,每一行不匹配就执行写入,会造成重复写入;如果文件为空(首次注册),循环直接跳过,完全不执行写入。
- 字段无分隔符:写入用户信息时没有用逗号分隔字段,后续读取时
split(',')无法正确拆分数据。 - 密码校验参数颠倒:
sha256_crypt.verify(hashpass, password)参数顺序错误,正确顺序是verify(明文密码, 哈希密码)。 - 未处理文件不存在场景:首次注册时
users.txt不存在,执行open('users.txt', 'r')会触发文件不存在异常。 - 缺少Flask秘钥:使用
flash消息需要配置secret_key,否则消息无法正常显示。
修正后的完整代码
from datetime import datetime from flask import Flask, render_template, request, flash from passlib.hash import sha256_crypt app = Flask(__name__) app.secret_key = 'your-secret-key-here' # 必须设置,flash才能生效 @app.route('/', methods=['GET', 'POST']) def index(): return render_template('Header.html', datetime=str(datetime.now())) @app.route('/main/', methods=['GET', 'POST']) def main(): return render_template('dashboard.html', datetime=str(datetime.now())) @app.route('/PerfectGrade/', methods=['GET', 'POST']) def perfect_grade(): return render_template('perfectgrade.html', datetime=str(datetime.now())) @app.route('/MasterGrade/', methods=['GET', 'POST']) def master_grade(): return render_template('mastergrade.html', datetime=str(datetime.now())) @app.route('/RealGrade/', methods=['GET', 'POST']) def real_grade(): return render_template('realgrade.html', datetime=str(datetime.now())) @app.route('/HighGrade/', methods=['GET', 'POST']) def high_grade(): return render_template('highgrade.html', datetime=str(datetime.now())) @app.route('/Register/', methods=['GET', 'POST']) def register(): return render_template('register.html', datetime=str(datetime.now())) @app.route('/LoginSuccess/', methods=['POST']) def login_success(): return render_template('loginsuccess.html', datetime=str(datetime.now())) @app.route('/LoginFail/', methods=['POST']) def login_fail(): return render_template('loginfail.html', datetime=str(datetime.now())) @app.route('/Login/', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form.get("username") password = request.form.get("password") # 处理文件不存在的情况 try: with open('users.txt', 'r') as f: for line in f.readlines(): line = line.strip() if not line: continue info = line.split(',') if len(info) < 3: continue # 跳过格式错误的行 stored_username = info[0] stored_hash = info[2] if username == stored_username: if sha256_crypt.verify(password, stored_hash): flash('You are logged in!') return render_template('header.html') else: flash('Incorrect Password') return render_template('login.html', datetime=str(datetime.now())) # 遍历完所有行都没找到匹配的用户名 flash('Username does not exist') except FileNotFoundError: flash('No registered users yet') return render_template('login.html', datetime=str(datetime.now())) @app.route('/success/', methods=['POST']) def success(): first_name = request.form.get("first_name") last_name = request.form.get("last_name") username = request.form.get("username") email = request.form.get("email") password = request.form.get("password") user_exists = False # 检查用户名和邮箱是否已存在 try: with open('users.txt', 'r') as f: for line in f.readlines(): line = line.strip() if not line: continue info = line.split(',') if len(info) < 2: continue stored_username = info[0] stored_email = info[1] if stored_username == username or stored_email == email: user_exists = True break except FileNotFoundError: # 文件不存在,说明是第一个用户,无需检查 pass if user_exists: flash("Username or email already exists. Please try again.") return render_template('register.html') else: # 哈希密码并写入文件 hash_pass = sha256_crypt.hash(password) # 用逗号分隔字段,每行一个用户 user_line = f"{username},{email},{hash_pass},{first_name},{last_name}\n" with open('users.txt', 'a') as f: f.write(user_line) flash("Success!") return render_template('success.html', datetime=str(datetime.now()), first_name=first_name, last_name=last_name, username=username, email=email)
关键修改说明
- 重构注册逻辑:先完整遍历用户文件检查重复,确认无重复后再执行写入,避免循环中重复写入的问题;同时处理文件不存在的异常,首次注册直接写入。
- 添加字段分隔符:写入时用逗号分隔各个用户字段,每行结尾加换行符,确保每行对应一个用户,后续读取时能正确拆分。
- 修正密码校验顺序:将
sha256_crypt.verify(hashpass, password)改为sha256_crypt.verify(password, stored_hash),符合工具函数的参数要求。 - 添加Flask秘钥:初始化时设置
app.secret_key,保证flash消息能正常显示。 - 健壮性优化:登录和注册时都添加了对空行、格式错误行的跳过处理,避免因文件内容异常导致程序崩溃。
内容的提问来源于stack exchange,提问作者evogamer
相关产品推荐
相关产品推荐

