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

Flask开发注册功能时Python无法识别txt文件中已存在的用户名问题

问题根因
  • 生成器取值逻辑错误:你定义的info()是生成器函数,调用后返回可迭代的生成器对象,每迭代一次返回一组(用户名, 密码)。直接写username, password = info()会尝试把生成器返回的所有元素解包赋值给两个变量,仅当passfile.txt里恰好有2组用户时这段代码才不会报错,此时username存储的是第一组用户的(用户名,密码)元组,password存储的是第二组用户的(用户名,密码)元组,完全不符合获取所有已注册用户名的需求。当注册用户数不等于2时,这段代码要么抛出解包异常,要么拿到的变量完全不符合预期,这就是功能突然失效的核心原因。
  • 存在性判断逻辑错误:if un in username是判断输入字符串是否为username变量的子串,而非判断输入用户名是否和某个已注册用户名完全相等,会出现输入ad就匹配到admin的错误校验结果。
修复代码

修改注册函数的用户校验逻辑,先读取所有已注册用户名存入集合再做判断:

@week6.route("/registration", methods=["GET", "POST"])
def register():
    """
    新用户注册函数
    """
    # 读取所有已注册用户名存入集合
    exist_usernames = set()
    for un, _ in info():
        exist_usernames.add(un)

    if request.method == "POST":
        un = request.form.get("username")
        pw = request.form.get("password")
        secure = sc.hash(str(pw))
        register.secure = secure
        print(un)
        # 校验用户名是否已存在
        if un in exist_usernames:
            flash("该用户名已被注册")
            return render_template("registration.html")
        
        if pw_verify(pw) == True:
            add_info(un, secure)
            flash("注册成功!")
                
    return render_template("registration.html")

可选优化:给info()函数增加异常兼容,避免空行或格式错误导致索引越界:

def info():
    with open('passfile.txt', "r") as f:
        for line in f:
            line = line.strip()
            # 跳过空行
            if not line:
                continue
            text = line.split()
            # 跳过格式错误的行
            if len(text) >= 2:
                yield text[0], text[1]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:54:01