我尝试做的是,一旦用户提交了所有结果,我希望它根据我的过滤器更新Fixture_prediction模型。虽然我得到的是400个不好的请求。日志并没有告诉我足够的知道什么是错的。有什么想法吗?
我认为它与通过表单提交的元组数据有关...
表单显示正常,当我提交表单时,它会直接发出错误的请求。
我的错误
Bad Request
The browser (or proxy) sent a request that this server could not understand.
我目前拥有的内容:
视图
@app.route('/predictor/',methods=['GET','POST'])
@login_required
def predictions():
user_id = g.user.id
# retrieve predictions
prediction= db.session.query(Fixture_prediction,\
Fixture_prediction.fixture_id,Fixture.stage,\
Fixture.home_team,Fixture_prediction.home_score,\
Fixture_prediction.away_score,Fixture.away_team)\
.outerjoin(Fixture,Fixture.id==Fixture_prediction.fixture_id)\
.outerjoin(User,Fixture_prediction.user_id == User.id)\
.filter(Fixture_prediction.fixture_id==Fixture.id)\
.filter(Fixture_prediction.user_id==user_id).all()
data = {'predictions': prediction}
form = PredictionListForm(data=MultiDict(data))
if request.method == 'POST':
if form.validate() == False:
flash('A score is missing, please fill in all predictions')
render_template('predictor.html', form=form)
else:
#for pred in prediction:
store=Fixture_prediction.query\
.filter_by(user_id=user_id)\
.filter_by(fixture_id=request.form['fixture_id'])\
.update({'home_score':request.form['home_score']\
,'away_score':request.form['away_score']})
db.session.commit()
flash('Prediction added')
return redirect(url_for("predictions"))
# display current predictions
elif request.method == 'GET':
return render_template('predictor.html', form=form)
模板
{% extends "base.html" %}
{% block content %}
<h1>Predictions</h1>
<p></p>
<p>Please make your predictions here</p>
<form action='' method='post'>
{{form.predictions()}}
<p><input type="submit" value="Submit Predictions"></p>
</form>
{% endblock %}
形式
class PredictionForm(WTForm):
fixture_id = fields.IntegerField(validators=[validators.required()])
stage = fields.TextField(validators=[validators.required()])
home_team = fields.TextField(validators=[validators.required()])
home_score = fields.IntegerField(validators=[validators.required()])
away_score = fields.IntegerField(validators=[validators.required()])
away_team = fields.TextField(validators=[validators.required()])
class PredictionListForm(WTForm):
predictions = FieldList(FormField(PredictionForm))
答案 0 :(得分:2)
问题是fixture_id
中没有字段request.form
。这会导致基础MultiDict引发KeyError
,由Flask转换为400。
没有fixture_id
的原因是因为您正在使用字段附件FieldList
和FormField
这两个字段将改变您提供给WTForms的名称以避免冲突。
修复方法是简单地使用您必须访问数据的form
实例(因为WTForms已经为您映射了它):
# in your else clause
for prediction in form.predictions:
store = Fixture_prediction.query \
.filter_by(user_id=user_id) \
.filter_by(fixture_id=prediction.fixture_id.data)
# etc.
答案 1 :(得分:0)
根据flask docs,在以下情况下发生400:
如果表单属性中不存在键,会发生什么?在那里面 case引发一个特殊的KeyError。你可以像标准一样抓住它 KeyError但如果不这样做,则会出现HTTP 400错误请求错误页面 而是显示。因此,在许多情况下,您无需处理 那个问题。
听起来,wtform正在访问一个不在multidict中的密钥,引发了一个关键错误。要测试它,请使用try / except包装validate调用。 (我想,我认为这是发生keyerror的地方)。如果您发现异常,您将得到答案。