Senden von Daten aus dem HTML-Formular an ein Python-Skript in Flask

79

Ich habe den folgenden Code in meinem Python-Skript:

def cmd_wui(argv, path_to_tx):
    """Run a web UI."""
    from flask import Flask, flash, jsonify, render_template, request
    import webbrowser
    app = Flask(__name__)


    @app.route('/tx/index/')
    def index():
        """Load start page where you select your project folder
        or load history projects from local DB."""
        from txclib import get_version
        txc_version = get_version()
        prj = project.Project(path_to_tx)

        # Let's create a resource list from our config file
        res_list = []
        prev_proj = ''
        for idx, res in enumerate(prj.get_resource_list()):
                hostname = prj.get_resource_host(res)
        username, password = prj.getset_host_credentials(hostname)
        return render_template('init.html', txc_version=txc_version, username=username)

Außerdem habe ich ein HTML-Formular in init.html:

<form>
<input type="text" id="projectFilepath" size="40" placeholder="Spot your project files">
<input type="button" id="spotButton" value="Spot">
</form>

Wie kann ich die Benutzereingabe von "projectFilepath" übergeben, wenn ein Benutzer auf "spotButton" für eine Variable in meinem Python-Skript klickt?

Ich bin neu in Python und Flask, also vergib mir, wenn ich Fehler mache.

Mpampinos Holmens
quelle
1
Ihre projectFilepathEingabe muss eine haben nameAttribut - Set - dann können Sie den Wert in zugreifen request.args.value_of_name(oder request.form.value_of_namewenn eine tun POSTAnfrage.
Sean Vieira
1
Ich wollte die Subtilität hervorheben, dass Sie das idAttribut auf dem <input>Tag verwenden, während die folgenden Antworten verwenden name. nameist das, was Sie wollen, denn das kommt als Schlüssel herein request.form.
Trenton

Antworten:

145

Für das formTag müssen zwei Attribute festgelegt werden:

  1. action: Die URL, an die die Formulardaten beim Senden gesendet werden. Generieren Sie es mit url_for. Es kann weggelassen werden, wenn dieselbe URL das Formular anzeigt und die Daten verarbeitet.
  2. method: Gibt an, ob die Daten als Abfragezeichenfolge (GET) oder als Formulardaten (POST) gesendet werden sollen.

Das inputTag benötigt einen nameParameter.

Fügen Sie eine Ansicht hinzu, um die übermittelten Daten zu verarbeiten, die sich request.formunter demselben Schlüssel wie die Eingaben befinden name.

@app.route('/handle_data', methods=['POST'])
def handle_data():
    projectpath = request.form['projectFilepath']
    # your code
    # return a response

Stellen Sie die Formulare actionauf die URL dieser Ansicht ein, indem Sie Folgendes verwenden url_for:

<form action="{{ url_for('handle_data') }}" method="post">
    <input type="text" name="projectFilepath">
    <input type="submit">
</form>
Codecool
quelle
7
methodist eigentlich optional - standardmäßig GET. Ansonsten sind Sie genau richtig.
Sean Vieira
4
Da ich ein Noob bin (buchstäblich der erste Tag, an dem ich an Flask arbeite), war mir zunächst nicht klar, dass man das tun mussfrom flask import Flask, request
CodeFinity
3
Ich bevorzuge es zu verwenden, request.form.get('projectFilepath')anstatt request.form['projectFilepath']zu vermeiden, dass eine Ausnahme angezeigt wird, wenn ein Nullwert gesendet wird.
Ibrahim.H
2
Eine andere Sache zu bemerken ist, url_fornach der Funktion mit diesem Namen zu handle_data
suchen
56

Sie benötigen eine Flask-Ansicht, die POST-Daten empfängt, und ein HTML-Formular, das diese sendet.

from flask import request

@app.route('/addRegion', methods=['POST'])
def addRegion():
    ...
    return (request.form['projectFilePath'])
<form action="{{ url_for('addRegion') }}" method="post">
    Project file path: <input type="text" name="projectFilePath"><br>
    <input type="submit" value="Submit">
</form>
Dawid Drozd
quelle