我们在视图函数中进行如下处理:
test.py:
-
@app.route('/',methods=['GET','POST'])
-
def index():
-
form = NameForm()
-
if form.validate_on_submit():
-
user = User.query.filter_by(name=form.name.data).first()
-
if user is None:
-
user=User(name=form.name.data)
-
db.session.add(user)
-
session['name']=form.name.data
-
form.name.data=''
-
return redirect(url_for('index'))
-
return render_template('index.html',form=form,name=session['name'])
第5行,先从数据库中查询是否存在用户填写的名称的用户。
第6行,进行判断,如果不存在该用户,那么创建一个新User,并添加到db.session中去。然后通过全局变量session将用户名缓存到本地。
第11行,进行重定向,这样刷新页面时就不会重新POST表单。
第12行,返回index.html,将表单对象以及利用session缓存的name传给html。
index.html:
-
<form method="POST">
-
Hello {% if name %}{{name}} {% else %} stranger {% endif%}
-
{{form.hidden_tag()}}
-
<p>{{form.name.label}}</p>
-
{{form.name()}}
-
<br>{{form.submit }}
-
</form>
上面的代码,实现了判断文本框中输入的用户名,如果用户名在数据库中已经存在,则打印出再次相见的欢迎消息,如果用户名在数据库中不存在则打印出初次见面的欢迎消息并将用户保存到数据库中.
之所以引用这段代码其实是像说明SQLAlchemy数据库管理中一个知识点,请留意代码中将新用户存入数据库中的语句:
db.session.add(user)
之前在使用shell进行数据库存储时我们强调过,向数据库中存入数据时,一定要先add后commit修改才会生效?为什么这里没有使用db.session.commit()呢?
这是在之前我们介绍过得一个知识点,因为我们在实例化SQLAlchemy对象时,曾经设置过一个自动提交的参数:
-
app=Flask(__name__)
-
app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///'+os.path.join(basedir+'data.sqlite')
-
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']=True
-
db=SQLAlchemy(app)
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']=True就是设置自动提交,也就不需要我们再手动进行commit。