老师,关于通过表单保存数据的问题

老师,关于通过表单保存数据的问题

我的Pychram如下面运行还是报这个错误['csrf_token': ['The CSRF token is missing.']]

from flask import Flask, render_template, redirect, url_for  # Flask模块和Flask的render_template方法
from flask_sqlalchemy import SQLAlchemy  # 创建模型需导入的模块
from flask_wtf import CSRFProtect

from forms import LoginForm, RegisterForm

app = Flask(__name__)
# 配置数据库的连接参数
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:abc123456@127.0.0.1/test_flask'
# 配置WTF表单
app.config['WTF_CSRF_SECRET_KEY'] = 'abc123456'
app.config['SECRET_KEY'] = 'abc'

# 获取当前上下文
app_ctx = app.app_context()
# 推送到上下文里
app_ctx.push()
# 实例化把app传进去
db = SQLAlchemy(app)


# 设置模型,继承db中的Model
class User(db.Model):
    # 指定表的名称
    __tablename__ = 'weibo_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__ = 'weibo_user_addr'
    id = db.Column(db.Integer, primary_key=True)
    addr = db.Column(db.String(256), nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('weibo_user.id'), nullable=False)
    user = db.relationship('User', backref=db.backref('address', lazy=True))


@app.route('/')
def index():
    """ 首页 """
    return render_template('index.html')


@app.route('/user/<int:page>/')
def list_user(page):
    """ 用户分页 """
    per_page = 10  # 每一页的数据大小
    # 1.查询用户信息
    user_ls = User.query
    # 2.准备分页的数据
    user_page_data = user_ls.paginate(page, per_page=per_page)
    return render_template('list_user.html', user_page_data=user_page_data)


@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_enabled为False表示不做csrf校验
    form = RegisterForm(csrf_enabled=False)
    # 用户提交表单时会触发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('index'))
    else:
        # 打印错误信息
        print(form.errors)
    return render_template('page_register.html', form=form)


# v1.0之后的版本,不推荐的写法
if __name__ == '__main__':
    app.run(debug=True)
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(label='登录')


class RegisterForm(FlaskForm):
    """ 用户注册表单 """

    def __init__(self, csrf_enabled, *args, **kwargs):
        super().__init__(csrf_enabled=csrf_enabled, *args, **kwargs)

    username = StringField(label='用户名', default='')
    password = PasswordField(label='密码')
    birth_date = DateField(label='生日')
    age = IntegerField(label='年龄')
    submit = SubmitField('注册')
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户注册</title>
</head>
<body>
    <h3>用户注册</h3>
    <form action="{{ url_for('page_register') }}" method="post">
        <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>

然后我试着把在form.py中添加的__init__方法注释掉,再把app.py中的csrf_enabled=False去掉,再然后在page_register.html中添加了https://img1.sycdn.imooc.com//climg/64c909c309efb2da02550038.jpg

在app.py中添加了CSRFProtect(app)

https://img1.sycdn.imooc.com//climg/64c90a1109e47d7304750071.jpg

运行后添加数据到数据库成功了

我的疑问是为什么我和你设置一样的代码效果怎么不一样?因为版本不同吗?


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
qq_慕婉清1197770 提问者 2023-08-01 21:44:02

疑问以解决

  • 同学,你好!同学可以自己解决问题,棒棒哒~

    祝学习愉快~

    2023-08-02 09:33:29
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师