老师,关于通过表单保存数据的问题
我的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中添加了
在app.py中添加了CSRFProtect(app)
运行后添加数据到数据库成功了
我的疑问是为什么我和你设置一样的代码效果怎么不一样?因为版本不同吗?
10
收起
正在回答 回答被采纳积分+1
1回答
qq_慕婉清1197770
2023-08-01 21:44:02
疑问以解决
Python全能工程师
- 参与学习 人
- 提交作业 16247 份
- 解答问题 4470 个
全新版本覆盖5大热门就业方向:Web全栈、爬虫、数据分析、软件测试、人工智能,零基础进击Python全能型工程师,从大厂挑人到我挑大厂,诱人薪资在前方!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星