从 Flask 中的变量渲染按钮

Rendering buttons from variables in Flask

我正在尝试使用 Flask 创建一个页面,该页面的按钮名称和操作是在代码的 python 部分而不是 HTML 部分中定义的。

代码的最小工作示例如下所示: main.py:

from flask import Flask

def init_app():
    """Construct core Flask application with embedded Dash app."""
    app = Flask(__name__)

    with app.app_context():
        # Import parts of our core Flask app
        import routes
        return(app)

app = init_app()

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

routes.py:

from flask import render_template, redirect, request
from flask import current_app as app

@app.route('/', methods=['GET', 'POST'])
def home():
    if request.method == 'POST':
        print(request.form.get('test_action'))
        print(request.form.get('extra_action'))
    elif request.method == 'GET':
        return render_template('buttons.html', form="form", extra_name = "Extra_Name", extra_action = "extra_action")
    
    return render_template("buttons.html", extra_name = "Extra_Name", extra_action = "extra_action")

和templates/buttons.html

    <form method="post" action="/">
        <h4>button name: TEST</h4>
        <h4>button action: test_action</h4>
        <input type="submit" value="TEST" name="test_action"/>

        <h4>button name: {{extra_name}}</h4>
        <h4>button action: {{extra_action}}</h4>
        <input type="submit" value={{extra_name}} name={{extra_action}}/>

    </form>

呈现如下:

main.py 正在初始化所有内容,其中没有发生任何相关的事情。

在routes.py中,按钮名称和动作名称被传递给HTML代码。 HTML 代码创建了两个按钮:一个使用硬编码的名称,另一个使用从 Flask 中获取的名称。然后 routes.py 打印它从每个按钮获得的值。例如,当程序第一次启动时,它打印

None
None

如果按下测试按钮,它将打印

TEST
None

现在,据我了解,当按下 Extra_name 按钮时,它应该输出

None
Extra_name

如果我在 Extra_name 和 extra_action 我自己分到他们应该去 HTML 的地方,这也是它的工作方式,但它给出了

None
None

我知道 HTML 可以看到 {{extra_name}}{{extra_action}} 是什么,因为它正上方将它们呈现为文本,因此据我所知,将值替换为两段代码是相同的。因此我不明白为什么一个有效而另一个无效。

那是因为

<input type="submit" value={{extra_name}} name={{extra_action}}/>

会给你 extra_action/ 而不是 extra_action

您可以使用

修复它
<input type="submit" value={{extra_name}} name={{extra_action}}></input>

结果:

None
Extra_Name