Flask注册表单使用flash传递错误列表报错的解决咨询
解决Flask注册表单的TypeError及相关问题
核心错误修复
报错TypeError: 'type' object does not support item assignment的直接原因是变量名拼写错误:
你在代码开头定义了错误列表errors = ["","",""],但在密码匹配校验行写成了error[2] = "Password and confirm password doesn't match"。error是Python内置的错误类型对象,无法进行元素赋值,把error改成errors即可解决这个报错。
其他优化修复点
除了核心错误,代码还有几个可以优化的地方,避免后续出现问题:
- 密码校验位置调整:密码匹配检查和数据库数据无关,不需要放在遍历CSV行的循环里,放在循环外只执行一次即可。
- 文件操作规范:使用
with语句打开文件,无需手动调用close(),代码更简洁且能避免资源泄漏。 - 路径转义处理:Windows路径用原始字符串(
r"path")或正斜杠,避免转义字符引发的路径错误。 - Jinja模板修正:
get_flashed_messages()返回的是消息列表,你flash的是一个错误列表,所以模板里需要先提取这个错误列表再进行判断展示。
修正后的Python代码
from flask import Flask, request, flash, redirect, session import csv @app.route("/signup-request", methods=['POST']) def signupRequest(): errors = ["", "", ""] # Error 0 => username taken # Error 1 => email used # Error 2 => password mismatch name = request.form["name"] usrnm = request.form["username"] email = request.form["email"] paswd = request.form["password"] cpswd = request.form["confirm password"] # 先检查密码匹配 if paswd != cpswd: errors[2] = "Password and confirm password doesn't match" # 检查用户名和邮箱是否已存在 with open(r".\database\accounts.csv", "rt") as RacF: read = csv.reader(RacF) for rows in read: if rows[1] == usrnm: errors[0] = "Username has already been taken" if rows[2] == email: errors[1] = "Email has already been registered" # 更简洁的错误判断方式 if any(errors): flash(errors) print("signup failed") print(errors) return redirect(request.referrer) else: with open(r".\database\accounts.csv", "at") as WacF: WacF.write(f'{name},{usrnm},{email},{paswd}\n') session["user"] = usrnm return "<h1>You're registered</h1>"
修正后的HTML模板代码
<form action="/signup-request" method="POST" class="form shadow"> {% with messages = get_flashed_messages() %} {% if messages %} {% set errors = messages[0] %} <p> <label for="nm">Name :</label><br/> <input type="text" name="name" id="nm" placeholder="Full Name..." class="wd-lg" required/><br/> <label for="usrnm">Username :</label><br/> <input type="text" name="username" id="usrnm" placeholder="Username..." class="wd-lg" required/><br/> {% if errors[0] != "" %} {{ errors[0] }}<br/> {% endif %} <label for="email">Email Address :</label><br/> <input type="email" name="email" id="email" placeholder="E-Mail Address" class="wd-lg" required/><br/> {% if errors[1] != "" %} {{ errors[1] }}<br/> {% endif %} Password :<br/> <input type="password" name="password" id="paswd" placeholder="Password" class="wd-lg" required/><br/> <input type="password" id="cpaswd" name="confirm password" placeholder="Confirm Password" class="wd-lg" required/> {% if errors[2] != "" %} {{ errors[2] }}<br/> {% endif %} </p> <p> <input type="checkbox" id="chk" onclick="showPassword()"/> <label for="chk" style="cursor: pointer;">Show Password</label> </p> <p> <input type="submit" value="Signup" class="btn wd-lg btn-primary"/> </p> {% else %} <p> <label for="nm">Name :</label><br/> <input type="text" name="name" id="nm" placeholder="Full Name..." class="wd-lg" required/><br/> <label for="usrnm">Username :</label><br/> <input type="text" name="username" id="usrnm" placeholder="Username..." class="wd-lg" required/><br/> <label for="email">Email Address :</label><br/> <input type="email" name="email" id="email" placeholder="E-Mail Address" class="wd-lg" required/><br/> Password :<br/> <input type="password" name="password" id="paswd" placeholder="Password" class="wd-lg" required/><br/> <input type="password" id="cpaswd" name="confirm password" placeholder="Confirm Password" class="wd-lg" required/> </p> <p> <input type="checkbox" id="chk" onclick="showPassword()"/> <label for="chk" style="cursor: pointer;">Show Password</label> </p> <p> <input type="submit" value="Signup" class="btn wd-lg btn-primary"/> </p> {% endif %} {% endwith %} </form>
内容的提问来源于stack exchange,提问作者Moeez Raza
相关产品推荐
相关产品推荐

