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

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即可解决这个报错。

其他优化修复点

除了核心错误,代码还有几个可以优化的地方,避免后续出现问题:

  1. 密码校验位置调整:密码匹配检查和数据库数据无关,不需要放在遍历CSV行的循环里,放在循环外只执行一次即可。
  2. 文件操作规范:使用with语句打开文件,无需手动调用close(),代码更简洁且能避免资源泄漏。
  3. 路径转义处理:Windows路径用原始字符串(r"path")或正斜杠,避免转义字符引发的路径错误。
  4. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:24:58