SQLalchemy / wtforms更新问题 - 400错误的请求 [英] SQLalchemy/wtforms update issue - 400 bad request
问题描述
我认为它与通过表单提交的元组数据做了...
形式显示罚款,只是当我提交表单直接到一个不好的请求。
我的错误
错误请求
浏览器(或代理)发送了此服务器无法理解的请求。
目前我有:
views
@ app.route('/ predictor /',methods =''GET','POST'])
@login_required
def predictions():
user_id = g.user.id
#检索预测
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在所有预测中)
render_template('predictor.html',form = form)
else:
#for pred在预测中:
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))
#显示当前预测
elif request.method =='GET':
return render_template('predictor.html',fo rm =表格)
模板
{%extendsbase.html%}
{%block content%}
< h1> ;预测< / H1>
< p>< / p>
< p>请在此处进行预测< / p>
< form action =''method ='post'>
{{form.predictions()}}
< p>< input type =submitvalue =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 (validator = [validators.required()])
away_score = fields.IntegerField
class PredictionListForm(WTForm):
predictions = FieldList(FormField(PredictionForm))
<解决方案问题是 request.form 中没有字段
fixture_id
code>。这会导致底层的MultiDict产生一个 KeyError
,它被Flask翻译为400.
原因是没有 解决方法是简单地使用 What I'm trying to do is, once the user submits all the results I want it to update the Fixture_prediction model according to my filters. Although what I get is 400 bad request. The log doesnt tell me enough to know whats going wrong. Any ideas? I think its to do with the tuple data submitted through the form... The form displays fine its just when I submit the form it goes straight to a bad request. my error What I have currently: views template forms
The problem is that there is no field The reason there is no The fix is to simply use the
这篇关于SQLalchemy / wtforms更新问题 - 400错误的请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋! fixture_id
是因为您正在使用外壳 FieldList
和 FormField
这两个修改你提供给WTForms的名字,以避免冲突。
表单 code $>实例,你必须访问数据(因为WTForms已经为你映射):
#in你的else子句
用于预测form.predictions:
store = Fixture_prediction.query \
.filter_by(user_id = user_id)\
.filter_by(fixture_id = prediction.fixture_id .data)
#等
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))
fixture_id
in request.form
. This results in a KeyError
being raised by the underlying MultiDict, which is translated into a 400 by Flask.fixture_id
is because you are using the field enclosures FieldList
and FormField
both of which alter the names you provide to WTForms to avoid collisions.form
instance that you have to access the data (as WTForms has already mapped it for you):# 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.