发布请求格式的Flask服务器端验证



我有一个HTML表单,其中输入了美元值。

<tr>
<form action="/save_report/" method="POST">
<td>{{event.event_name}}</td>
<input type="hidden" name='id' id="e_name" value="{{event.event_ID}}">
<td>{{event.office}}<br></td>
<td>{{event.event_city}}</td>
<td>
{% for r in event.reps %}
<li>{{r.date_worked.strftime('%m-%d-%Y')}} By {{r.rep}}</li>
{% endfor %}
</td>
<td>{{event.items}}</td>
<td>
<label for="total">Total bill for event</label><br>
<input type="number" min=0 step=".01" id="total" value="" name="total" placeholder="50.00" required><br>
<input type="hidden" name="id" value="{{event.event_ID}}">
<input type="hidden" name="office" value="{{event.office}}">
<button type="submit" class="btn btn-primary btn-md">Save</button>
</td>
</form>
</tr>

这只适用于某些浏览器,我不喜欢数字输入上的小箭头。

我可以用JS进行检查,但如果用户关闭了它,它仍然无法解决问题。

我想将数据发布到服务器,并确保发布请求中的字符串格式为12.34,如果没有,则向HTML返回错误。

这是当前的服务器端:

@app.route('/save_report/',methods=['POST', 'GET'])
@login_required
def save_report():
role = session.get('role')
name = session.get('name')
id = session.get('id')
if request.method == 'POST':
total=request.form['total']
event=request.form['id']
office=request.form['office']
print(total,event,office)
return redirect(url_for('reports'))

我的想法是像这样的if语句

if request.method == 'POST':
total=request.form['total']
event=request.form['id']
office=request.form['office']
# Need to validate format here?
if total != "11.11":
return redirect(url_for('reports' error=error))
else:
print(total,event,office)
return redirect(url_for('reports'))

然而,我不知道如何检查字符串的格式。非常感谢您的指导!

如果我正确理解你,你想要的是如何检查total是否为浮点值。您可以简单地使用re模块进行检查。

@app.route('/save_report/',methods=['POST', 'GET'])
@login_required
def save_report():
role = session.get('role')
name = session.get('name')
id = session.get('id')
if request.method == 'POST':
total=request.form['total']
event=request.form['id']
office=request.form['office']
if re.match("^d+?.d+?$", total) is None:
return redirect(url_for('error_page'))
return redirect(url_for('reports'))

除了regex,您还可以像这样简单地进行检查。

try:
f_total = float(total)
except ValueError:
return redirect(url_for('error_page'))

如果你只想接受两位小数的两位浮点值,你可以使用这个正则表达式re.match("^d{2}.d{2}$", total)

最新更新