webentwicklung-frage-antwort-db.com.de

Flask Python Buttons

Ich versuche, zwei Schaltflächen auf einer Seite zu erstellen. Für jeden möchte ich ein anderes python Skript auf dem Server ausführen. Bisher habe ich nur eine Schaltfläche mit bekommen/sammeln können

def contact():
  form = ContactForm()

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

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

Was muss ich je nach gedrücktem Knopf ändern?

46
dojogeorge

Geben Sie Ihren beiden Schaltflächen den gleichen Namen und unterschiedliche Werte:

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

Dann können Sie in Ihrer Flask Ansichtsfunktion feststellen, welche Schaltfläche zum Absenden des Formulars verwendet wurde:

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)
94
Miguel

Der geeignete Weg, dies zu tun:

@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

Fügen Sie die Schaltflächen watch und download in Ihre Vorlage ein:

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

Falls noch jemand hinschaute und auf diesen SO post stieß wie ich.

<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')

Einfach, präzise und es funktioniert. Sie müssen nicht einmal ein Formularobjekt instanziieren.

8
poply

Ich gehe damit folgendermaßen um:

<html>
    <body>

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

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

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

Python-Code:

    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 __== '__main__':
        app.run()
4
user3427630

Wenden Sie (unterschiedliche) Namensattribute auf beide Schaltflächen wie an

<button name="one">

und fangen sie in request.data.

2

Ich finde diese Lösung gut:

@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)

Bilden:

class ContactForm(FlaskForm):

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