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
相关产品推荐
相关产品推荐

