SQLalchemy/wtforms更新问题400个错误请求

2024-09-30 04:39:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做的是,一旦用户提交了所有的结果,我希望它根据我的过滤器更新Fixture_预测模型。虽然我得到的是400个错误的请求。日志不能告诉我出什么问题。有什么想法吗?在

我认为这和通过表单提交的元组数据有关。。。在

表单显示良好,就在我提交表单时,它直接指向一个错误的请求。在

我的错误

Bad Request

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

我目前拥有的:

视图

^{pr2}$

模板

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

Tags: form表单fieldshome错误requiredh1class
2条回答

根据flask docs,当:

What happens if the key does not exist in the form attribute? In that case a special KeyError is raised. You can catch it like a standard KeyError but if you don’t do that, a HTTP 400 Bad Request error page is shown instead. So for many situations you don’t have to deal with that problem.

听起来wtform正在访问一个不在multidict中的键,从而引发keyerror。要测试这一点,请用try/except包装validate调用。(我想,我假设这就是keyerror发生的地方)。如果你抓住了例外,你就会得到答案。在

问题是request.form中没有fixture_id字段。这就导致了一个KeyError被底层的多重字典所提升,而这个多重字典被烧瓶翻译成400。在

没有fixture_id的原因是您使用的是字段附件FieldList和{},这两个字段都会更改提供给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. 

相关问题 更多 >

    热门问题