SQLalchemy / wtforms更新问题 - 400错误的请求 [英] SQLalchemy/wtforms update issue - 400 bad request

查看:145
本文介绍了SQLalchemy / wtforms更新问题 - 400错误的请求的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图做的是,一旦用户提交所有结果,我希望它根据我的过滤器更新Fixture_prediction模型。虽然我得到的是400个不好的要求。日志没有告诉我足够的知道什么是错的。任何想法?

我认为它与通过表单提交的元组数据做了...

形式显示罚款,只是当我提交表单直接到一个不好的请求。



我的错误

 错误请求

浏览器(或代理)发送了此服务器无法理解的请求。

目前我有:



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.



原因是没有 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)
#等


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

Bad Request

The browser (or proxy) sent a request that this server could not understand.

What I have currently:

views

@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)

template

{% 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 %}

forms

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))

解决方案

The problem is that there is no field fixture_id in request.form. This results in a KeyError being raised by the underlying MultiDict, which is translated into a 400 by Flask.

The reason there is no 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.

The fix is to simply use the 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. 

这篇关于SQLalchemy / wtforms更新问题 - 400错误的请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆