【问题标题】:Force Flask to Wait for Form Submission Event Before Function Execution强制 Flask 在函数执行前等待表单提交事件
【发布时间】:2020-05-06 11:46:41
【问题描述】:

我正在构建我的第一个 Flask 应用,并拥有以下带有路由的应用:

from flask import Flask, render_template, request 
from dbConnect import get_config_tables
import pandas  

app = Flask(__name__)

@app.route('/config', methods=["POST", "GET"])
def config_reader():
    ID = request.form.get("ID")
    inputID = 12036
    result = get_config_tables(inputID)
    df = result.head(10)
    return render_template('config.html',  inputID = ID, tables=[df.to_html(classes='data', header = "true")])

if __name__ == '__main__':
    app.run(debug=True)

函数get_config_tables 是我编写的一个python 函数,它与SQL Server 通信并获取一些表。当我将inputID 硬编码为get_config_tables 时,该函数在 Flask 应用程序中按预期运行,并且 HTML 按预期打印到屏幕上。

但是,当我尝试将值 ID 传递为 get_config_tables(ID) 时,我得到了错误。我认为 Flask 试图在传递 ID 值之前执行我的函数,但由于该函数需要输入值,因此在输入有效值之前它将失败。

有没有办法可以强制 Flask 等待执行函数 get_config_tables 直到点击提交事件按钮?

如果需要任何进一步的信息来更好地理解我的问题,我很乐意提供。

对应的HTML是:

{% extends "layout.html" %}

{% block body %}

<h6>

Get a config table
<br><br>

<form action = "{{url_for('config_reader')}}" method = "POST">
    <input type = "text" name = "ID" placeholder = "Enter a confid ID">
    <button> Submit </button>

You entered {{inputID}}.

<hline>
<br><br>
The results are:
<br>
</h6> 
<small>
<center>
{% for table in tables %}
            {{ table|safe }}
{% endfor %}
</center>
</small>

{% endblock %}

【问题讨论】:

  • 在传递 id 之前不会尝试执行。您确定您的请求中有 id 吗?您是否仔细检查并打印了它的值?另外你得到的错误信息是什么?
  • @TheFool,是的,HTML 包含You entered {{inputID}},当我输入一个值时,它会在我点击提交后打印到屏幕上。所以我知道正在传递一些东西。
  • 不是 html,你的后端。您正在尝试访问那里的 id。同时显示最重要的错误,其他任何事情都无关紧要。
  • 还显示你的函数,它以 id 作为参数。
  • 这似乎是我得到的最相关的错误。 pandas.io.sql.DatabaseError: Execution failed on sql 'select * from table where ConfigID = None': ('42S22', "[42S22] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid column name 'None'. (207) (SQLExecDirectW)")

标签: python flask


【解决方案1】:

在我看来,即使没有 ID,您也在使用此页面,因为您的表单与表格位于同一页面上。

这意味着不是每次您的端点被命中时,都会随请求发送一个 ID,您会看到您还注册了一个 GET 方法。通常,该 ID 不会出现在该请求中。

所以你需要检查这个 id 是否确实存在,然后才尝试发送你的表数据。

所以我能想出的最幼稚的方法就是使用 if 语句来检查 id 是否存在。

@app.route('/config', methods=["POST", "GET"])
def config_reader():
    ID = request.form.get("ID")

    t = get_config_tables(ID).head(10).to_html(
        classes='data', header = "true"
    ) if ID else '<table></table>'

    return render_template('config.html',  inputID = ID, tables= [t])

我尚未对此进行测试,但这是如何检查 id 的要点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多