Daten aus einem Textfeld in Flask senden?

89

Ich habe mich gefragt, ob es eine Möglichkeit gibt, etwas aus einem Textfeld im HTML-Code zu entnehmen, es in eine Flasche zu geben und diese Daten dann mit Python zu analysieren. Ich dachte, dies könnte einige JS betreffen, aber ich könnte mich irren. Irgendwelche Ideen?

ollien
quelle
Warum nicht ein HTML-Formular verwenden und es direkt veröffentlichen? Oder müssen Sie dies asynchron tun? In diesem Fall müssen Sie etwas über AJAX nachlesen. :-)
Martijn Pieters
1
Ich weiß, dass ich ein HTML-Formular verwenden kann, aber wie würde ich diese Informationen an die Kolben-App weitergeben?
ollien

Antworten:

148

Wenn Sie nichts Komplizierteres tun möchten, ist es ziemlich einfach, Daten aus einem HTML-Formular in Flask einzugeben.

  • Erstellen Sie eine Ansicht, die eine POST-Anforderung akzeptiert ( my_form_post).
  • Greifen Sie auf die Formularelemente im Wörterbuch zu request.form.

templates/my-form.html::

<form method="POST">
    <input name="text">
    <input type="submit">
</form>
from flask import Flask, request, render_template

app = Flask(__name__)

@app.route('/')
def my_form():
    return render_template('my-form.html')

@app.route('/', methods=['POST'])
def my_form_post():
    text = request.form['text']
    processed_text = text.upper()
    return processed_text

Dies ist die Flask-Dokumentation zum Zugriff auf Anforderungsdaten .

Wenn Sie kompliziertere Formulare benötigen, die validiert werden müssen, können Sie sich WTForms und deren Integration in Flask ansehen .

Hinweis: wenn Sie irgendwelche anderen Einschränkungen haben, können Sie nicht wirklich brauchen JavaScript um alle Ihre Daten zu senden (obwohl Sie können es verwenden).

Pascha
quelle
1
Hey, das hat einmal funktioniert, aber jetzt wirft es einen Fehler 500, irgendwelche Ideen?
ollien
Es sollte gut funktionieren ... Setzen Sie es app.debug = Truekurz davor, app.run()damit Sie die Ausnahme und den Traceback des Fehlers erhalten.
Pacha
Ja, das habe ich vergessen, ich war ein Idiot und habe vergessen, mein HTML in meinen Vorlagenordner zu legen.
ollien
Ich habe ein bisschen Zeit damit verschwendet, dies mit einem größeren Textbereich anstelle eines Textfelds zu tun, wenn jemand dies mit Flask tun muss. Die Lösung ist hier
Kardamom
@cardamom Ich verstehe nicht wirklich, was du meinst. Die Verwendung eines Textbereichs oder einer Eingabe vom Typ Text ändert in keiner Weise die Lösung (die, die Sie verknüpfen, ist genau die gleiche wie diese). Sie müssen nicht die Python - Seite ändern, ersetzen Sie einfach <input type="text" name="text">durch , <textarea name="text"></textarea>und Sie sollten in Ordnung sein.
Pacha
9

Deklarieren Sie einen Flask-Endpunkt, um den POST-Eingabetyp zu akzeptieren, und führen Sie dann die erforderlichen Schritte aus. Verwenden Sie jQuery, um die Daten zu veröffentlichen.

from flask import request

@app.route('/parse_data', methods=['GET', 'POST'])
def parse_data(data):
    if request.method == "POST":
         #perform action here
var value = $('.textbox').val();
$.ajax({
  type: 'POST',
  url: "{{ url_for('parse_data') }}",
  data: JSON.stringify(value),
  contentType: 'application/json',
  success: function(data){
    // do something with the received data
  }
});
Kracekumar
quelle
2

Alle Interaktionen zwischen Server (Ihre Flask-App) und Client (Browser) erfolgen auf Anfrage und Antwort. Wenn der Benutzer in Ihrem Formular auf die Schaltfläche "Senden" klickt, sendet sein Browser eine Anfrage mit diesem Formular an Ihren Server (Flask-App), und Sie können den Inhalt des Formulars wie folgt abrufen:

request.args.get('form_name')
Denis
quelle
1

Vorausgesetzt , dass Sie bereits wissen , wie man einen Blick schreiben in Flask, der antwortet auf eine URL, erstellen, das die liest request.postDaten. Um die input boxzu diesem Beitrag hinzugefügten Daten hinzuzufügen , erstellen Sie auf Ihrer Seite ein Formular mit dem Textfeld. Sie können dann verwenden, um jqueryzu tun

var data = $('#<form-id>').serialize()

und dann asynchron in Ihre Ansicht posten, indem Sie etwas wie das Folgende verwenden.

$.post('<your view url>', function(data) {
  $('.result').html(data);
});
Pratik Mandrekar
quelle
0

Das hat bei mir funktioniert.

def parse_data():
    if request.method == "POST":
        data = request.get_json()
        print(data['answers'])
        return render_template('output.html', data=data)
$.ajax({
      type: 'POST',
      url: "/parse_data",
      data: JSON.stringify({values}),
      contentType: "application/json;charset=utf-8",
      dataType: "json",
      success: function(data){
        // do something with the received data
      }
    });
Anurag Sharma
quelle