Отправить данные из текстового поля во Flask?

92

Мне было интересно, есть ли способ взять что-то из текстового поля в HTML, передать это во флягу, а затем проанализировать эти данные с помощью Python. Я думал, что здесь может быть задействован JS, но я мог ошибаться. Любые идеи?

Оллин
источник
Почему бы не использовать HTML-форму и напрямую отправить ее по почте? Или нужно делать это асинхронно? В этом случае вам нужно почитать об AJAX. :-)
Мартейн Питерс
1
Я знаю, что могу использовать HTML-форму, но как передать эту информацию в приложение Flask?
Оллин

Ответы:

154

Если вы не хотите делать что-то более сложное, загрузить данные из HTML-формы во Flask довольно просто.

  • Создайте представление, которое принимает запрос POST ( my_form_post).
  • Доступ к элементам формы в словаре 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

Это документация Flask о доступе к данным запроса .

Если вам нужны более сложные формы, требующие проверки, вы можете взглянуть на WTForms и как их интегрировать с Flask .

Примечание: если у вас есть какие - либо другие ограничения, вы действительно не нужно JavaScript на все , чтобы отправить данные (хотя вы можете использовать его).

пача
источник
1
Эй, это сработало однажды, но теперь выдает ошибку 500, есть идеи?
Оллин, 06
Он должен работать нормально ... Поместите app.debug = Trueнепосредственно перед, app.run()чтобы получить исключение и трассировку ошибки.
pacha
Да, я забыл об этом, я был идиотом и забыл поместить свой HTML в папку с шаблонами.
Оллин,
Я потратил немного времени, пытаясь сделать это с большим текстовым полем вместо текстового поля, если кому-то нужно сделать это с помощью Flask, решение здесь
кардамон
@cardamom Я не совсем понимаю, что вы имеете в виду. Использование текстового поля или ввода типа текста никоим образом не меняет решение (тот, который вы связываете, точно такой же, как этот). Вам не нужно менять сторону Python, просто замените <input type="text" name="text">на, <textarea name="text"></textarea>и все будет в порядке.
pacha
9

Объявите конечную точку Flask для приема типа ввода POST, а затем выполните необходимые шаги. Используйте jQuery для публикации данных.

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
источник
2

Все взаимодействие между сервером (вашим флеш-приложением) и клиентом (браузером) происходит по запросу и по ответу. Когда пользователь нажимает кнопку отправки в вашей форме, его браузер отправляет запрос с этой формой на ваш сервер (приложение Flask), и вы можете получить содержимое формы, например:

request.args.get('form_name')
Денис
источник
1

Предполагая , что вы уже знаете , как написать представление в Flaskкоторый реагирует на URL, создать который считывает request.postданные. Чтобы добавить input boxк этому сообщению данные, создайте на своей странице форму с текстовым полем. Затем вы можете использовать jqueryдля

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

а затем опубликуйте в своем представлении асинхронно, используя что-то вроде следующего.

$.post('<your view url>', function(data) {
  $('.result').html(data);
});
Практик Мандрекар
источник
0

Это сработало для меня.

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
      }
    });
Анураг Шарма
источник