Python 强制Flask在函数执行之前等待表单提交事件

Python 强制Flask在函数执行之前等待表单提交事件,python,flask,Python,Flask,我正在构建我的第一个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 = reques

我正在构建我的第一个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\u config\u tables
是我编写的一个python函数,它与SQL Server通信并获取一些表。当我将
inputID
硬编码到
get\u config\u tables
中时,该函数在Flask应用程序中按预期运行,HTML按预期打印到屏幕上

但是,当我尝试将值
ID
作为
get\u config\u tables(ID)
传递时,会出现错误。我认为Flask试图在传递ID值之前执行我的函数,但由于该函数需要输入值,因此在输入有效值之前它将失败

有没有办法强迫Flask等待执行函数
get\u config\u 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 %}
{%extends“layout.html”%}
{%block body%}
获取配置表


提交 您输入了{{inputID}。

结果是:
{对于表%%中的表,%} {{表|安全}} {%endfor%} {%endblock%}
在我看来,即使没有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])

@app.route('/config',methods=[“POST”,“GET”])
def config_读取器():
ID=request.form.get(“ID”)
t=get_config_tables(ID).head(10).to_html(
class='data',header=“true”
)如果ID为“其他”
返回render_模板('config.html',inputID=ID,tables=[t])

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

在传递id之前,它不会尝试执行。你确定你的请求中有这个id吗?您是否仔细检查并打印了它的值?还有,您收到的错误消息是什么?@TheFool,是的,HTML包含您输入的
{{{inputID}
,当输入一个值时,它会在我点击提交后打印到屏幕上。所以我知道有些东西正在被传递。不是html,而是你的后端。您正在尝试访问那里的id。同时显示最重要的错误,其他任何事情都不重要。同时显示以id为参数的函数。这似乎是我得到的最相关的错误<代码>pandas.io.sql.DatabaseError:在sql“select*from table where ConfigID=None”上执行失败:('42S22',“[42S22][Microsoft][ODBC驱动程序17 for sql Server][sql Server]无效列名“None”。(207)(SQLExecDirectW)