烧瓶 Python 按钮

Posted

技术标签:

【中文标题】烧瓶 Python 按钮【英文标题】:Flask Python Buttons 【发布时间】:2013-11-16 15:55:52 【问题描述】:

我正在尝试在一个页面上创建两个按钮。每一个我都想在服务器上执行不同的 Python 脚本。到目前为止,我只使用了一个按钮获取/收集

def contact():
  form = ContactForm()

  if request.method == 'POST':
    return 'Form posted.'

  elif request.method == 'GET':
     return render_template('contact.html', form=form)

我需要根据按下的按钮进行哪些更改?

【问题讨论】:

【参考方案1】:

将(不同的)名称属性应用于两个按钮,例如

<button name="one">

并在 request.data 中捕获它们。

【讨论】:

你能举例说明如何在 Python 中捕获它们吗?【参考方案2】:

为您的两个按钮指定相同的名称和不同的值:

<input type="submit" name="submit_button" value="Do Something">
<input type="submit" name="submit_button" value="Do Something Else">

然后在你的 Flask 视图函数中你可以知道哪个按钮被用来提交表单:

def contact():
    if request.method == 'POST':
        if request.form['submit_button'] == 'Do Something':
            pass # do something
        elif request.form['submit_button'] == 'Do Something Else':
            pass # do something else
        else:
            pass # unknown
    elif request.method == 'GET':
        return render_template('contact.html', form=form)

【讨论】:

我认为最好有不同的名字。并检查名称 - 不是价值。如果 request.form 中的“do_something”... 为什么不用id 而不是name?在这种情况下会更好。 它也适用于 @Jimilian 我问得有点晚了,但是为什么你认为检查name而不是value更好?【参考方案3】:

这样做的适当方法:

@app.route('/')
def index():
    if form.validate_on_submit():
        if 'download' in request.form:
            pass # do something
        elif 'watch' in request.form:
            pass # do something else

watchdownload 按钮放入您的模板中:

<input type="submit" name="download" value="Download">
<input type="submit" name="watch" value="Watch">

【讨论】:

watchdownload 什么?名称属性的值是“watch”和“download”吗?我假设这是必须的,因为 Python if x in dict 语法。我更喜欢这个答案。它只需要澄清一下。【参考方案4】:

我是这样处理的:

<html>
    <body>

        <form method="post" action="/">

                <input type="submit" value="Encrypt" name="Encrypt"/>
                <input type="submit" value="Decrypt" name="Decrypt" />

        </form>
    </body>
</html>
    

Python 代码:

    from flask import Flask, render_template, request
    
    
    app = Flask(__name__)
    
    
    @app.route("/", methods=['GET', 'POST'])
    def index():
        print(request.method)
        if request.method == 'POST':
            if request.form.get('Encrypt') == 'Encrypt':
                # pass
                print("Encrypted")
            elif  request.form.get('Decrypt') == 'Decrypt':
                # pass # do something else
                print("Decrypted")
            else:
                # pass # unknown
                return render_template("index.html")
        elif request.method == 'GET':
            # return render_template("index.html")
            print("No Post Back Call")
        return render_template("index.html")
    
    
    if __name__ == '__main__':
        app.run()

【讨论】:

对我来说,这是在 Raspberry PI 上使用 Python3 运行的唯一可行的解​​决方案 :) 很好的例子,虽然看起来你有一个多余的/div【参考方案5】:

以防有人像我一样还在寻找并看到这篇 SO 帖子。

<input type="submit" name="open" value="Open">
<input type="submit" name="close" value="Close">

def contact():
    if "open" in request.form:
        pass
    elif "close" in request.form:
        pass
    return render_template('contact.html')

简单、简洁、有效。甚至不需要实例化表单对象。

【讨论】:

我试图在我自己的烧瓶程序中使用此代码 sn-p,但无法使其工作:# Validate Buttons if "Minute" in request.form: f = open ('testfile.txt', 'w') f.write('min') f.close() @skrhee 确保你用
标签包裹了&lt;input&gt;。通过一些故障排除,您应该能够确定您的视图函数是否被调用,然后“Minute”是否在request.form对象中以找出问题所在。
【参考方案6】:

我觉得这个解决方案不错:

@app.route('/contact', methods=['GET', 'POST'])
def contact():
    form = ContactForm()
    if form.validate_on_submit():
        if form.submit.data:
            pass
        elif form.submit2.data:
            pass
    return render_template('contact.html', form=form)

表格:

class ContactForm(FlaskForm):

    submit = SubmitField('Do this')
    submit2 = SubmitField('Do that')

【讨论】:

看起来像 FlaskForm is part of a separate flask_wtf package。【参考方案7】:

这项工作对我来说 .py

if request.method == "POST":
     if request.form.get('new Token'):
#something
     if request.form.get('custom Token'):
#something diferent

.html

<form method="post" >
<input type="submit" name="new Token" value="new Token">
<input type="submit" name="custom Token" value="custom Token">
</form>

之所以有效,是因为您不按下的按钮会将 None 返回给 python。 美好的一天

【讨论】:

以上是关于烧瓶 Python 按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何循环浏览烧瓶/python中的表单?

从烧瓶应用程序调用 python 函数

如何在 Python 的单独线程中启动烧瓶 api 服务器

使用烧瓶逐步展示演示

尝试仅使用 html 按钮将数据传递给烧瓶应用程序

无法使用带有两个按钮的烧瓶从 sqlite db 中删除记录