Wysłać dane z pola tekstowego do Flask?

92

Zastanawiałem się, czy istnieje sposób na pobranie czegoś z pola tekstowego w HTML, wprowadzenie go do kolby, a następnie przeanalizowanie tych danych w Pythonie. Myślałem, że to może obejmować JS, ale mogę się mylić. Jakieś pomysły?

ollien
źródło
Dlaczego nie skorzystać z formularza HTML i bezpośrednio go POST? A może musisz to zrobić asynchronicznie? W takim przypadku będziesz musiał poczytać o AJAX. :-)
Martijn Pieters
1
Wiem, że mogę użyć formularza HTML, ale jak mam przekazać te informacje do aplikacji kolby?
ollien,

Odpowiedzi:

154

Jeśli nie chcesz zrobić czegoś bardziej skomplikowanego, przesyłanie danych z formularza HTML do Flask jest całkiem proste.

  • Utwórz widok, który akceptuje żądanie POST ( my_form_post).
  • Uzyskaj dostęp do elementów formularza w słowniku 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

To jest dokumentacja Flask dotycząca dostępu do danych żądań .

Jeśli potrzebujesz bardziej skomplikowanych formularzy, które wymagają walidacji, możesz rzucić okiem na WTForms i jak je zintegrować z Flaskiem .

Uwaga: jeśli nie masz żadnych innych ograniczeń, naprawdę nie trzeba JavaScript w ogóle wysłać swoje dane (chociaż można go używać).

pacha
źródło
1
Hej, raz to działało, ale teraz wyrzuca błąd 500, jakieś pomysły?
ollien
Powinno działać dobrze ... Umieść app.debug = Truetuż przed, app.run()aby uzyskać wyjątek i śledzenie błędu.
pacha
Tak, zapomniałem o tym, byłem idiotą i zapomniałem umieścić kod HTML w folderze szablonów.
ollien
Zmarnowałem trochę czasu, próbując to zrobić z większym obszarem tekstowym zamiast pola tekstowego, jeśli ktoś musi to zrobić z Flaskiem, rozwiązanie jest tutaj
kardamon
@cardamom Naprawdę nie rozumiem, co masz na myśli. Korzystanie z obszaru tekstowego lub wprowadzania tekstu tekstowego w żaden sposób nie zmienia rozwiązania (ten, który łączysz, jest dokładnie taki sam jak ten). Nie musisz zmieniać strony Pythona, po prostu zamień <input type="text" name="text">na <textarea name="text"></textarea>i powinno być dobrze.
pacha
9

Zadeklaruj punkt końcowy Flask, aby zaakceptować typ danych wejściowych POST, a następnie wykonaj niezbędne kroki. Użyj jQuery, aby opublikować dane.

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
źródło
2

Cała interakcja między serwerem (Twoją aplikacją Flask) a klientem (przeglądarką) odbywa się poprzez żądanie i odpowiedź. Gdy użytkownik kliknie przycisk, prześle w formularzu, jego przeglądarka wyśle ​​żądanie z tym formularzem na Twój serwer (aplikacja flask), a otrzymasz zawartość formularza taką jak:

request.args.get('form_name')
Denis
źródło
1

Zakładając, że już wie, jak napisać widok na Flaskktóry reaguje na URL, stworzyć taki, który odczytuje request.postdane. Aby dodać dane input boxdo tego posta, utwórz formularz na swojej stronie z polem tekstowym. Następnie możesz użyć jquerydo zrobienia

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

a następnie publikuj w swoim widoku asynchronicznie, używając czegoś takiego jak poniżej.

$.post('<your view url>', function(data) {
  $('.result').html(data);
});
Pratik Mandrekar
źródło
0

To zadziałało dla mnie.

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
źródło