我正在尝试显示一个带有表单的页面,然后Player在提交表单时将一个添加到数据库。但是,我无法查看该表单,因为浏览器始终显示400 Bad Request错误。其他帖子表明这可能是因为表单输入的名称与我从中获取的键不匹配request.form,但是我所有的键均匹配。为什么会出现此错误?
Player
400 Bad Request
request.form
<form method="post"> {{ form.hidden_tag() }} <input name="name"> <input name="available"> <input type="submit"> </form> @app.route('/addplayer', methods=['GET', 'POST']) def addplayer(): connect('basketball_contracts', host='localhost', port=27017) n = request.form['name'] a = request.form['available'] post= Post( name=n, available=a ) post.tags = ['test'] post.save() return render_template('addplayer.html', form=form)
您的视图接受GET并POST请求。request.form仅在上填写POST。如果您尝试访问不存在的密钥,则会引发400错误。GET最初页面时没有键。
GET
POST
造成这种情况的常见模式是守护需要代码request.form在一个if request.method == 'POST'块中。处理POST请求后返回重定向,否则返回渲染的模板。
if request.method == 'POST'
from flask import url_for, redirect, render_template @app.route('/addplayer', methods=['GET', 'POST']) def addplayer(): if request.method == 'POST': Post( name=request.form['name'], available=request.form['available'] ).save() return redirect(url_for('index')) return render_template('addplayer.html')
由于您似乎正在使用Flask-WTF,因此可以使用表单的validate_on_submit方法而不是使用check method。在这种情况下,您还可以通过表单实例访问数据,并使用该表单为您呈现输入。
validate_on_submit
method
from flask import url_for, redirect, render_template @app.route('/addplayer', methods=['GET', 'POST']) def addplayer(): form = AddPlayerForm() if form.validate_on_submit(): Post( name=form.name.data, available=form.available.data ).save() return redirect(url_for('index')) return render_template('addplayer.html', form=form) <form method=post> {{ form.hidden_tag() }} {{ form.name.label}} {{ form.name }}<br> {{ form.available.label }} {{ form.available }}<br> <input type=submit value="Add Player"> </form>