页面未重定向且 db.session.add() 和 db.session.commit() 命令无效
Page is not redirecting and db.session.add() and db.session.commit() commands are not working
我刚开始学习烧瓶。我正在尝试处理用户注册表格。但是在我的 routes.py 中,表单的数据没有被推送到数据库,而且在单击提交按钮后页面也没有重定向。没有错误或任何警告。只是没有执行操作,只是重新加载了注册页面。
我附上了以下文件的代码。 demo是我的HTML模板和.py文件保存的文件夹。
#run.py : located outside the root(demo) folder
from demo import app
if __name__ == '__main__':
app.run(debug=True)
-------------------------------------------------------------------------------------
#__init__.py
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///demo.db'
app.config['SECRET_KEY'] = 'df159ba68c3577847ef3dfef'
db = SQLAlchemy(app)
from demo import routes
-------------------------------------------------------------------------------------
#model.py
from demo import db
class Item(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(50), nullable=False, unique=True)
email = db.Column(db.String(100), unique=True)
password = db.Column(db.String(60), nullable=False)
def __repr__(self):
return f'Item {self.username}'
------------------------------------------------------------------------------------
#form.py
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
class RegisterForm(FlaskForm):
username = StringField(label='Username')
email = StringField(label='Email')
password = PasswordField(label='Password')
submit = SubmitField(label='Create Account')
-------------------------------------------------------------------------------------
#routes.py
from demo import app
from flask import render_template, redirect, url_for
from demo.model import Item
from demo.form import RegisterForm
from demo import db
@app.route('/')
@app.route('/home')
def hello_world():
return render_template('home.html', item_name="number")
@app.route('/info')
def second_page():
items = Item.query.all()
return render_template('info.html', items=items)
@app.route('/register', methods=['GET', 'POST'])
def registration_page():
form = RegisterForm()
if form.validate_on_submit():
user_to_create = Item(username=form.username.data,
email=form.email.data,
password=form.password.data)
db.session.add(user_to_create)
db.session.commit()
return redirect(url_for('second_page'))
return render_template('register.html', form=form)
-----------------------------------------------------------------------------------
#register.html
{% extends 'base.html' %}
{% block title %}
Registration page
{% endblock %}
{% block content %}
<form method="POST" >
{{ form.username.label() }}
{{ form.username(placeholder='Enter Your Username') }}
{{ form.email.label() }}
{{ form.email(placeholder='Enter Your Email') }}
{{ form.password.label() }}
{{ form.password(placeholder='Enter Your Password') }}
{{ form.submit() }}
</form>
{% endblock %}
----------------------------------------------------------------------------------
#info.html :The page from second_page() function in routes.py
{% extends 'base.html' %}
{% block title %}
This is Info page
{% endblock %}
{% block content %}
<h1>you are in the info page</h1>
<h1>Welcome to this page</h1>
<h1>Great day!</h1>
{% for item in items %}
<p>{{ item.username }} - {{ item.email }}</p>
{% endfor %}
{% endblock %}
这些是我项目中的文件。请帮助我清除此功能错误。提前致谢。
您的表单从未经过验证,因为您没有使用 csrf 令牌。
您可以尝试在 if 语句
之前和之后打印 print(form.errors)
[...]
form = RegisterForm()
print(form.errors)
if form.validate_on_submit():
user_to_create = Item(username=form.username.data,
email=form.email.data,
password=form.password.data)
db.session.add(user_to_create)
db.session.commit()
return redirect(url_for('second_page'))
print(form.errors)
return render_template('register.html', form=form)
一开始不会报错,提交后就没有crsf token
在html中可以添加{{form.csrf_token}}
<form method="POST" >
{{ form.csrf_token }} // add this and this should work
{{ form.username.label() }}
{{ form.username(placeholder='Enter Your Username') }}
{{ form.email.label() }}
{{ form.email(placeholder='Enter Your Email') }}
我刚开始学习烧瓶。我正在尝试处理用户注册表格。但是在我的 routes.py 中,表单的数据没有被推送到数据库,而且在单击提交按钮后页面也没有重定向。没有错误或任何警告。只是没有执行操作,只是重新加载了注册页面。
我附上了以下文件的代码。 demo是我的HTML模板和.py文件保存的文件夹。
#run.py : located outside the root(demo) folder
from demo import app
if __name__ == '__main__':
app.run(debug=True)
-------------------------------------------------------------------------------------
#__init__.py
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///demo.db'
app.config['SECRET_KEY'] = 'df159ba68c3577847ef3dfef'
db = SQLAlchemy(app)
from demo import routes
-------------------------------------------------------------------------------------
#model.py
from demo import db
class Item(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(50), nullable=False, unique=True)
email = db.Column(db.String(100), unique=True)
password = db.Column(db.String(60), nullable=False)
def __repr__(self):
return f'Item {self.username}'
------------------------------------------------------------------------------------
#form.py
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
class RegisterForm(FlaskForm):
username = StringField(label='Username')
email = StringField(label='Email')
password = PasswordField(label='Password')
submit = SubmitField(label='Create Account')
-------------------------------------------------------------------------------------
#routes.py
from demo import app
from flask import render_template, redirect, url_for
from demo.model import Item
from demo.form import RegisterForm
from demo import db
@app.route('/')
@app.route('/home')
def hello_world():
return render_template('home.html', item_name="number")
@app.route('/info')
def second_page():
items = Item.query.all()
return render_template('info.html', items=items)
@app.route('/register', methods=['GET', 'POST'])
def registration_page():
form = RegisterForm()
if form.validate_on_submit():
user_to_create = Item(username=form.username.data,
email=form.email.data,
password=form.password.data)
db.session.add(user_to_create)
db.session.commit()
return redirect(url_for('second_page'))
return render_template('register.html', form=form)
-----------------------------------------------------------------------------------
#register.html
{% extends 'base.html' %}
{% block title %}
Registration page
{% endblock %}
{% block content %}
<form method="POST" >
{{ form.username.label() }}
{{ form.username(placeholder='Enter Your Username') }}
{{ form.email.label() }}
{{ form.email(placeholder='Enter Your Email') }}
{{ form.password.label() }}
{{ form.password(placeholder='Enter Your Password') }}
{{ form.submit() }}
</form>
{% endblock %}
----------------------------------------------------------------------------------
#info.html :The page from second_page() function in routes.py
{% extends 'base.html' %}
{% block title %}
This is Info page
{% endblock %}
{% block content %}
<h1>you are in the info page</h1>
<h1>Welcome to this page</h1>
<h1>Great day!</h1>
{% for item in items %}
<p>{{ item.username }} - {{ item.email }}</p>
{% endfor %}
{% endblock %}
这些是我项目中的文件。请帮助我清除此功能错误。提前致谢。
您的表单从未经过验证,因为您没有使用 csrf 令牌。 您可以尝试在 if 语句
之前和之后打印 print(form.errors)[...]
form = RegisterForm()
print(form.errors)
if form.validate_on_submit():
user_to_create = Item(username=form.username.data,
email=form.email.data,
password=form.password.data)
db.session.add(user_to_create)
db.session.commit()
return redirect(url_for('second_page'))
print(form.errors)
return render_template('register.html', form=form)
一开始不会报错,提交后就没有crsf token
在html中可以添加{{form.csrf_token}}
<form method="POST" >
{{ form.csrf_token }} // add this and this should work
{{ form.username.label() }}
{{ form.username(placeholder='Enter Your Username') }}
{{ form.email.label() }}
{{ form.email(placeholder='Enter Your Email') }}