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

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)

关键修改说明

  1. 重构注册逻辑:先完整遍历用户文件检查重复,确认无重复后再执行写入,避免循环中重复写入的问题;同时处理文件不存在的异常,首次注册直接写入。
  2. 添加字段分隔符:写入时用逗号分隔各个用户字段,每行结尾加换行符,确保每行对应一个用户,后续读取时能正确拆分。
  3. 修正密码校验顺序:将sha256_crypt.verify(hashpass, password)改为sha256_crypt.verify(password, stored_hash),符合工具函数的参数要求。
  4. 添加Flask秘钥:初始化时设置app.secret_key,保证flash消息能正常显示。
  5. 健壮性优化:登录和注册时都添加了对空行、格式错误行的跳过处理,避免因文件内容异常导致程序崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:45:30