我正在尝试创建一个使用Flask-SQLAlchemy和WTForms的简单Flask应用程序。目标是有一个简单的表单,在提交时将信息推送到数据库,并在表单底部的数据库中显示当前条目。理想情况下,在提交表单信息的那一刻,我希望推送到数据库的信息能够立即反映在同一页面上。这是我现在拥有的:
from flask import Flask, render_template, redirect, url_for, request
from flask_bootstrap import Bootstrap
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField
from wtforms.validators import InputRequired, Email, Length
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://(REMOVED FOR QUESTION)/testing'
app.config['SECRET_KEY'] = 'abcd'
Bootstrap(app)
db = SQLAlchemy(app)
class ActivityPanel(FlaskForm): #WTF FORM DEFINITION
text_title = StringField('Text Info', validators=[InputRequired()])
class Alerts(UserMixin, db.Model): #FLASK SQL ALCHEMY DEFINITION
InputID = db.Column(db.Integer, primary_key = True, autoincrement=True)
text_alert = db.Column(db.String(100), nullable = False, server_default="None")
db.create_all()
@app.route('/alerts', methods=['GET', 'POST'])
def alerts1():
form = ActivityPanel()
if form.validate_on_submit():
alert_object = Alerts(text_alert=form.text_title.data)
db.session.add(alert_object)
db.session.commit()
database_pull = Alerts.query.all()
return render_template('test.html', form = form, database_pull=database_pull)
if __name__ == '__main__':
app.run()
模板的代码如下:
{% extends "bootstrap/base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block styles %}
{{super()}}
<link rel="stylesheet" href="{{url_for('.static', filename='signin.css')}}">
{% endblock %}
{% block content %}
<div class="container">
<form class="form-signin" method="POST" action="/alerts">
<h2 class="form-signin-heading">Every time you click the submit button, it pushes to the database</h2>
{{ form.hidden_tag() }}
{{ wtf.form_field(form.text_title) }}
<button class="btn btn-lg btn-primary btn-block" type="submit">Push to database</button>
</form>
{% for query in database_pull %}
<li>{{ query.InputID }}</li>
<li>{{ query.text_alert }}</li>
{% endfor %}
</div> <!-- /container -->
{% endblock %}
目前看来,我遇到的主要问题是,抓取数据库中所有内容的数据库查询拉取对象只会在烧瓶程序启动时抓取并存储存储在数据库中的信息。一旦启动,即使我向数据库添加了更多数据,查询对象也不会反映新添加的信息。我必须最终关闭应用程序并重新启动它以使对象更新为新的数据库条目。
我希望有人可以回答,如果有一个简单的方法让我允许database_pull对象从实时数据库中抓取内容而不是一开始就抓取。基于我所读到的,这个问题与SQLAlchemy每个事务更新一次对象的状态有关。我试图使对象过期/刷新会话,但它不适用于Flask-SQLAlchemy。任何帮助将不胜感激。