我使用 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"> </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"> </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 ,可能只是在课堂上设置活动标签并不意味着该字段确实被选中了吗? />
非常感谢提前