【问题标题】:Flask - Return the Same Form that was SubmittedFlask - 返回提交的相同表单
【发布时间】:2026-01-03 07:30:01
【问题描述】:

在用户提交页面上的表单后,如何让 Flask 将用户返回到相同的页面,以相同的方式填写? 'render_template' 似乎只有在我提前知道所有变量的情况下才有效。我的表单是动态的,变量会根据用户所做的选择而变化。请参阅下面的伪代码了解我的想法。我知道 render_template 不能这样工作,但是有没有办法说“使用与渲染模板时相同的表单值?”

@app.route('./MyPage', methods=['GET', 'POST'])
def MyPage():

  if request.method == 'POST':
    # Do some stuff
    # return render_template('MyPage.html', context=request.form)
  else:
    # Do some other stuff

【问题讨论】:

  • 澄清:您希望将他们返回到页面并在表单中填写他们刚刚提交的内容?为什么?
  • 我正在尝试为用户以 .csv 格式填写的内容创建一个“保存”文件,以供他们下载。我正在接受表单输入并向他们发送一个 .csv 文件,以便他们稍后可以上传并从他们离开的地方继续。在我向他们发送 .csv 文件后,我想将它们路由回原来的位置,而不是让他们再次填写。也许有更简单的方法可以做到这一点?我是菜鸟。

标签: flask submit request.form


【解决方案1】:

以您要求它在表单上使用target="_blank" 的方式进行下载的最简单方法:

<form action="/MyPage" method="POST" target="_blank">
  <ul>
  {% for input in form %}
    <li>{{ input.label }} {{ input }}</li>
  {% endfor %}
  </ul>
</form>

那么你的POST-handling 方法不需要做任何其他事情,只需要返回 CSV:

@app.route('/MyPage', methods=['GET', 'POST'])
def MyPage():
  if request.method == 'POST':
    # Turn `request.form` into a CSV
    # see https://*.com/q/26997679/135978 for an example
    headers = {'Content-Disposition': 'attachment; filename=saved-form.csv', 'Content-Type': 'text/csv'}
    return form_as_csv, headers
  else:
    # Do some other stuff

如果您需要表单上的多个按钮,则无需在表单上设置target,您只需在触发CSV 的按钮上设置formtarget="_blank"

<form action="/MyPage" method="POST">
  <ul><!-- ... snip ... --></ul>
  <button name="submit_action" value="SAVE_AS_CSV" formtarget="_blank">Save as CSV</button>
  <button name="submit_action" value="RUN_CALCULATION">Run Calculation</button>
</form>

然后,您只需在 if request.method == 'POST' 块中添加对 request.form['submit_action'] 的检查,然后您就可以参加比赛了:

if request.method == 'POST':
    if request.form['submit_action'] == 'SAVE_AS_CSV':
        # Return the CSV response
    else:
        # Return the calculation response

另见:Writing a CSV from Flask framework

【讨论】:

  • 我应该更清楚。我实际上在表单中有多个提交按钮,一个用于保存,一个用于运行计算,因此将表单目标设置为“_blank”将适用于一个按钮,但不适用于另一个。不过,这是转换为 .csv 的有用参考。
  • 已更新以支持多个表单按钮,而无需在行为@DCB2524 中将它们全部设为target=_blank
最近更新 更多