Python:Flask+wtf+csrf提交表单

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)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值