Надіслати дані з текстового поля в Flask?


92

Мені було цікаво, чи є спосіб взяти щось із текстового поля в HTML, подати його в колбу, а потім проаналізувати ці дані за допомогою Python. Я думав, що це може задіяти якусь JS, але я можу помилитися. Будь-які ідеї?


Чому б не використовувати форму HTML та не розмістити її безпосередньо? Або це потрібно робити асинхронно? У цьому випадку вам доведеться трохи прочитати на AJAX. :-)
Мартін Пітерс

1
Я знаю, що можу використовувати HTML-форму, але як би я передав цю інформацію в програму-колбу?
ollien

Відповіді:


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, будь-які ідеї?
ollien

Це мало б працювати нормально ... Поставте app.debug = Trueперед цим, app.run()щоб ви отримали виняток та зворотний зв'язок помилки.
pacha

Так, я забув про це, я був ідіотом і забув помістити свій HTML в папку шаблону.
ollien

Я витратив трохи часу, намагаючись зробити це з більшим текстовим полем замість текстового поля, якщо комусь потрібно зробити це за допомогою Flask, рішення тут
кардамон

@cardamom Я насправді не розумію, що ти маєш на увазі. Використання текстового поля або введення тексту типу ні в якому разі не змінює рішення (те, що ви посилаєте, точно таке ж, як і це). Вам не потрібно міняти сторону Python, просто замініть <input type="text" name="text">на, <textarea name="text"></textarea>і у вас все буде добре.
pacha

9

Оголосіть кінцеву точку колби, щоб прийняти тип введення 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
  }
});

2

Вся взаємодія між сервером (додаток-колба) та клієнтом (браузер) відбувається за запитом та відповіддю. Коли користувач натискає кнопку "Надіслати" у вашій формі, його браузер надсилає запит із цією формою на ваш сервер (додаток-колба), і ви можете отримати вміст форми, наприклад:

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
      }
    });
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.