老师,关于通过表单保存数据的问题
我的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全能工程师
- 参与学习 人
- 提交作业 16415 份
- 解答问题 4469 个
全新版本覆盖5大热门就业方向:Web全栈、爬虫、数据分析、软件测试、人工智能,零基础进击Python全能型工程师,从大厂挑人到我挑大厂,诱人薪资在前方!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星