Flask:使用引导按钮组在表单上获取400 Bad request

时间:2014-06-02 23:08:24

标签: html forms flask

我使用 Flask bootstrap 来开发小型Web应用程序。对于此应用程序的设置页面,我从sqlite数据库中读取配置值并根据这些值在页面上绘制控件,所有这些都包含在html表单中,因此当我更改设置并提交表单时,我可以将请求全部发送到写回数据库的值:

{% extends "base.html" %}
{% block content %}
<body onLoad="$('.btn-group').button();">
<form name='form' method='post' action='/conf'>
  <div class="container">
  <div class="jumbotron">
    <h1>Settings</h1>
    <p class="lead">config</p>
    <p><a class="btn btn-lg btn-success" href="/" role="button"><i class="fa fa-home">&nbsp;</i>Home</a>
    <input type="submit" class="btn btn-lg btn-danger" role="button" name="save" value="Apply" /></p>
  </div>
  <div class="row marketing">
    <div class="col-md-4">
      <h2>setting 1</h2>
      <p>Status 1: <span class="badge">{{status}}</span></p>
        <div class="btn-group" data-toggle="buttons">
          <label class="btn btn-default{{' active' if cloud=="on"}}"><input type="radio" name="cloud" value="on">On</label>
          <label class="btn btn-default{{' active' if cloud=="off"}}"><input type="radio" name="cloud" value="off">Off</label>
        </div>
    </div>
    <div class="col-md-4">
      <h2>setting 2</h2>
      <div class="btn-group" data-toggle="buttons">
        <label class="btn btn-default{{' active' if res=="358x288"}}"><input type="radio" name="res" value="358x288">358x288</label>
        <label class="btn btn-default{{' active' if res=="640x480"}}"><input type="radio" name="res" value="640x480">640x480</label>
        <label class="btn btn-default{{' active' if res=="1280x1024"}}"><input type="radio" name="res" value="1280x1024">1280x1024</label>
      </div>
    </div>
  </div>
</div> <!-- /container -->
</form>
{% endblock %}

,这是生成的HTML代码(只是正文):

<body onLoad="$('.btn-group').button();">
<form name='form' method='post' action='/conf'>
    <div class="container">
    <div class="jumbotron">
        <h1>Settings</h1>
        <p class="lead">config</p>
        <p><a class="btn btn-lg btn-success" href="/" role="button"><i class="fa fa-home">&nbsp;</i>Home</a>
    <input type="submit" class="btn btn-lg btn-danger" role="button" name="save" value="Apply" /></p>
    </div>



    <div class="row marketing">
        <div class="col-md-4">
            <h2>setting 1</h2>
            <p>Status1: <span class="badge">on</span></p>
                <div class="btn-group" data-toggle="buttons">
                    <label class="btn btn-default active"><input type="radio" name="cloud" value="on">On</label>
                    <label class="btn btn-default"><input type="radio" name="cloud" value="off">Off</label>
                </div>  
        </div>
        <div class="col-md-4">
            <h2>setting 2</h2>
            <div class="btn-group" data-toggle="buttons">
                <label class="btn btn-default"><input type="radio" name="res" value="358x288">358x288</label>
                <label class="btn btn-default active"><input type="radio" name="res" value="640x480">640x480</label>
                <label class="btn btn-default"><input type="radio" name="res" value="1280x1024">1280x1024</label>
            </div>
        </div>
    </div>
</div> <!-- /container -->
</form>

渲染页面时,会正确绘制所有设置。例如,在具有分辨率值的三个单选按钮组上(用引导程序作为一组漂亮的按钮绘制),正确选择正确的值,例如640x480。

但是,在使用 POST 提交表单时,我收到 400错误请求,因为最初加载的原始值未更改的设置未通过到POST请求。但是,如果我点击已经选择的设置(比如单选按钮B - 因为单选按钮已经有了这个值,没有任何变化),那么该字段正确地包含在请求中。

我知道我可以通过检查POST请求中存在哪些字段(即args dict的哪些键存在)来解决这个问题,但是充满了 pythonic spirit ,我认为是纯HTML表单发布应包括表单中定义的所有字段,因此在处理请求时不需要进一步的控制。 问题是,为什么页面中的表单字段自渲染后未被包含在请求中?有没有办法强制包含这些值,或者我错过了什么?

也许这篇文章是另一篇 rubber duck debugging ,可能只是在课堂上设置活动标签并不意味着该字段确实被选中了吗? /> 非常感谢提前

0 个答案:

没有答案