HTML内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>欢迎登录</h3>
<form action="{{ url_for('page_register') }}" method="post">
{# 同步请求CSRF保护#}
{{ form.csrf_token }}
<p>
{{ form.username.label }}
{{ form.username }}
</p>
<p>
{{ form.password.label }}
{{ form.password }}
</p>
<p>
{{ form.birth_date.label }}
{{ form.birth_date }}
</p>
<p>
{{ form.age.label }}
{{ form.age }}
</p>
<p>
{{ form.submit }}
</p>
</form>
</body>
</html>
WTF生成表单:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, DateField, IntegerField
class LoginForm(FlaskForm):
"""登录表单的实现"""
username = StringField(label="用户名", default="admin")
password = PasswordField(label="密码")
submit = SubmitField("登录")
class RegisterForm(FlaskForm):
"""用户注册表单"""
# def __init__(self, csrf_enabled, *args, **kwargs):
# super().__init__(csrf_enabled=csrf_enabled, *args, **kwargs)
username = StringField(label="用户名")
password = PasswordField(label="密码")
birth_date = DateField(label="生日")
age = IntegerField(label="年龄")
submit = SubmitField("注册")
主代码:
from flask import Flask, render_template, render_template_string, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from forms import LoginForm, RegisterForm
app = Flask(__name__)
# w为模板引擎添加扩展,支持break,continue
# app.jinja_env.add_extension('jinja2.ext.loopcontrols');
# 配置数据库连接
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:123456@127.0.0.1/test_flask"
app.config["WTF_CSRF_SECRET_KEY"] = "abc1234aaa"
app.secret_key = "test1234"
# app.config["WTF_CSRF_ENABLED"] = False
# app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
# app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)
#所有模型的基类叫 db.Model,它存储在创建的SQLAlchemy实例上。
class User(db.Model):
__tablename__ = 'weimo_user'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), nullable=False)
password = db.Column(db.String(256), nullable=False)
birth_date = db.Column(db.DATE, nullable=True)
age = db.Column(db.Integer, default=0)
class UserAddress(db.Model):
"""用户地址"""
__tablename__ = 'weimo_user_addr'
id = db.Column(db.Integer, primary_key=True)
addr = db.Column(db.String(256), nullable=False)
# 外键关联weimo_user_addr表user_id关联weimo_user表的id键
user_id = db.Column(db.Integer, db.ForeignKey('weimo_user.id'), nullable=False)
#建立反向引用关系
user = db.relationship('User', backref=db.backref('addres', lazy=True))
@app.route("/form", methods=["GET", "POST"])
def page_form():
"""form表单练习"""
form = LoginForm()
return render_template("page_form.html", form=form)
@app.route("/user/register", methods=["GET", "POST"])
def page_register():
"""新用户注册"""
# 默认不做csrf效验
# form = RegisterForm(csrf_enabled=False)
form = RegisterForm()
# 用户在提交表单的时候,会触发validate_on_submit
if form.validate_on_submit():
# 表单验证通过,接下来处理业务逻辑
# 1.获取表单数据
username = form.username.data
password = form.password.data
birth_date = form.birth_date.data
age = form.age.data
# 2.构建用户对象
user = User(
username=username,
password=password,
birth_date=birth_date,
age=age
)
# 3.提交到数据库
db.session.add(user)
db.session.commit()
print("添加成功")
# 4.跳转到登录页
return redirect(url_for("page_form"))
else:
# 打印错误信息
print(form.errors)
return render_template("page_register.html", form=form)