页面未重定向且 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') }}