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

