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

Flask+SQLAlchemy注册页报错:user表无Uname列

问题修复方案

核心错误点

  • 路由与函数名完全混淆:/Signup路由绑定了logout函数,/Logout路由绑定了signup函数,导致注册逻辑无法正常执行,跳转自然失效。
  • 日期格式未转换:表单提交的生日是字符串类型,直接存入Date类型字段会触发类型错误。
  • 拼写错误:Flash提示的成功类别Succes应为Success。

修正后的代码

models.py(规范类名,可选但推荐)

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    Uname = db.Column(db.String(150), unique=True)
    Fname = db.Column(db.String(150))
    Sname = db.Column(db.String(150))
    bday = db.Column(db.Date)
    Email = db.Column(db.String(150), unique=True)
    Password = db.Column(db.String(150))
    notes = db.relationship('Note')

auth.py(修正核心错误)

from flask import Blueprint, render_template, request, flash, redirect, url_for
from .models import User  # 对应修改后的类名,若不改models则仍用user
from werkzeug.security import generate_password_hash, check_password_hash
from . import db
from datetime import datetime  # 导入日期转换工具

auth = Blueprint('auth', __name__)

# 登录路由
@auth.route("/login", methods=["POST", "GET"])
def login():
    if request.method == "POST":
        Uname = request.form.get("Uname")
        Password = request.form.get("Password")
        # 可补充登录逻辑:查询用户、验证密码等
    return render_template("login.html")

# 注册路由(修正函数名与路由匹配)
@auth.route('/Signup', methods=["POST", "GET"])
def signup():
    if request.method == "POST":
        Uname = request.form.get("Uname")
        Fname = request.form.get("Fname")
        Sname = request.form.get("Sname")
        bday_str = request.form.get("bday")
        Email = request.form.get("Email")
        Password = request.form.get("Password")
        ConPassword = request.form.get("ConPassword")

        # 注册校验逻辑
        if len(Fname) < 2:
            flash("名字长度不能少于2位", category='error')
        elif Password != ConPassword:
            flash("两次输入的密码不一致", category='error')
        elif len(Password) < 5:
            flash("密码长度不能少于5位", category='error')
        else:
            # 转换日期字符串为Date对象
            try:
                bday = datetime.strptime(bday_str, '%Y-%m-%d').date()
            except ValueError:
                flash("请输入正确的日期格式(YYYY-MM-DD)", category='error')
                return render_template("signup.html")
            
            # 创建用户对象(类名对应models里的定义)
            new_user = User(Uname=Uname, Fname=Fname, Sname=Sname, bday=bday, Email=Email, Password=generate_password_hash(Password, method='sha256'))
            db.session.add(new_user)
            db.session.commit()
            flash("账号创建成功!", category='Success')
            return redirect(url_for('views.home'))

    return render_template("signup.html")

# 登出路由(修正函数名)
@auth.route('/Logout')
def logout():
    # 补充登出逻辑:清除session等
    return redirect(url_for('auth.login'))

额外说明

  • 确保views蓝图中中存在home路由,否则url_for('views.home')会找不到路由报错。
  • 若未修改models里的类名,auth.py中导入和创建对象时保持user即可,但遵循Python大驼峰类名规范更利于维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 05:10:29