You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Flask-WTF无法获取提交的表单信息问题求助

问题分析与解决方案

首先,你遇到的表单提交后不执行print(request.data)、也不跳转的问题,最核心的原因是POST分支的代码没有返回重定向响应!

第一步:修复视图函数的POST逻辑

看你的这段代码:

if request.method =='POST':
    print(request.data)
    redirect('/selected')

这里的redirect('/selected')只是创建了一个重定向对象,但你没有把它返回给客户端,函数会继续执行后续代码,最终返回渲染模板的结果——自然不会触发跳转,甚至可能因为代码逻辑的延续,让你误以为print也没执行。

修正后的代码应该加上return:

if request.method =='POST':
    print(request.data)
    return redirect('/selected')  # 必须添加return才能让重定向生效

另外更规范的做法是用Flask-WTF的form.validate_on_submit()来判断表单是否合法提交,替代直接判断请求方法,同时用url_for生成路由更灵活(避免硬编码URL):

if form.validate_on_submit():
    # 直接获取表单字段值比request.data更直观
    print(f"选中的选项: {form.posting.data}")
    return redirect(url_for('main.selected'))

第二步:关于表单action=""的疑问

HTML中action=""的含义是表单会提交到当前页面的URL,也就是你的/cities路由——这本身是符合预期的,因为你的POST方法就定义在这个路由里,所以这不是导致你问题的直接原因。

如果确实需要让宏生成带指定action的表单,可以按以下方式修改:

假设你使用的渲染表单宏(flask-base里通常是templates/macros.html中的render_form)原本定义是这样:

{% macro render_form(form, button_text='Submit') %}
  <form method="POST" class="ui form">
    {{ form.hidden_tag() }}
    {% for field in form %}
      {% if field.type not in ['HiddenField', 'CSRFTokenField'] %}
        <div class="field">
          {{ field.label }}
          {{ field }}
          {% if field.errors %}
            {% for error in field.errors %}
              <div class="ui red basic pointing label">{{ error }}</div>
            {% endfor %}
          {% endif %}
        </div>
      {% endif %}
    {% endfor %}
    <button type="submit" class="ui button">{{ button_text }}</button>
  </form>
{% endmacro %}

给宏添加一个可选的action参数,修改后如下:

{% macro render_form(form, button_text='Submit', action='') %}
  <form method="POST" action="{{ action }}" class="ui form">
    {{ form.hidden_tag() }}
    {% for field in form %}
      {% if field.type not in ['HiddenField', 'CSRFTokenField'] %}
        <div class="field">
          {{ field.label }}
          {{ field }}
          {% if field.errors %}
            {% for error in field.errors %}
              <div class="ui red basic pointing label">{{ error }}</div>
            {% endfor %}
          {% endif %}
        </div>
      {% endif %}
    {% endfor %}
    <button type="submit" class="ui button">{{ button_text }}</button>
  </form>
{% endmacro %}

之后在渲染表单时,就可以指定action了:

{{ render_form(form, action=url_for('main.cities')) }}

额外小优化建议

  1. 拼接cities_list的代码可以用f-string简化,更易读:
cities_list.append(f"{r.city}-{r.email}-{elapsed_hours}")
  1. 如果r.datetime是数据库的datetime字段,直接用datetime对象计算时长更准确,无需转时间戳:
from datetime import datetime
elapsed_hours = round((datetime.now() - r.datetime).total_seconds() / 3600, 1)

内容的提问来源于stack exchange,提问作者user1592380

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:15:04