Bir metin kutusundan Flask'a veri gönderilsin mi?


92

HTML'deki bir metin kutusundan bir şey almanın, onu şişeye beslemenin ve ardından bu verileri Python ile ayrıştırmanın bir yolu olup olmadığını merak ediyordum. Bunun biraz JS içerebileceğini düşünüyordum ama yanılıyor olabilirim. Herhangi bir fikir?


Neden bir HTML formu kullanıp onu doğrudan YAYINLA YAYINLAMAYIN? Yoksa bunu eşzamansız olarak yapmanız mı gerekiyor? Bu durumda, AJAX'ta yapılacak bazı okumalarınız olacaktır. :-)
Martijn Pieters

1
Bir HTML formu kullanabileceğimi biliyorum, ancak bu bilgiyi flask uygulamasına nasıl iletebilirim?
ollien

Yanıtlar:


154

Daha karmaşık bir şey yapmak istemediğiniz sürece, verileri bir HTML formundan Flask'a beslemek oldukça kolaydır.

  • POST isteğini ( my_form_post) kabul eden bir görünüm oluşturun .
  • Sözlükteki form öğelerine erişin 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

Bu, talep verilerine erişimle ilgili Flask belgeleridir .

Doğrulama gerektiren daha karmaşık formlara ihtiyacınız varsa, WTForms'a ve bunları Flask ile nasıl entegre edeceğinize bir göz atabilirsiniz .

Not: Herhangi bir diğer kısıtlamalar yoksa, gerçekten JavaScript gerekmez hiç (bunu kullanabilirsiniz rağmen) verilerinizi göndermek için.


1
Hey, bu bir kez çalıştı, ama sonra şimdi bir 500 hatası veriyor, herhangi bir fikrin var mı?
ollien

Sadece iyi çalışıyor olmalı ... app.debug = TrueHemen önce koyun, app.run()böylece istisnayı alırsınız ve hatanın izini sürebilirsiniz.
pacha

Evet, bunu unuttum, bir aptaldım ve HTML'mi şablon klasörüme koymayı unuttum.
ollien

Bunu Flask ile yapması gereken biri varsa, bunu metin kutusu yerine daha geniş bir metin alanıyla yapmaya çalışırken biraz zaman harcadım çözüm burada
kakule

@cardamom Ne demek istediğini gerçekten anlamadım. Bir metin alanı veya metin türü girdi kullanmak çözümü hiçbir şekilde değiştirmez (bağladığınız çözüm tamamen bununla aynıdır). Sadece yerine, Python tarafını değiştirmek gerekmez <input type="text" name="text">tarafından <textarea name="text"></textarea>ve ince olmalıdır.
pacha

9

POST giriş türünü kabul etmek için bir Flask uç noktası bildirin ve ardından gerekli adımları uygulayın. Verileri göndermek için jQuery kullanın.

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

Sunucu (cep şişesi uygulamanız) ve istemci (tarayıcı) arasındaki istek ve yanıta göre gerçekleşen tüm etkileşim. Kullanıcı, formunuzda düğmesine bastığında, tarayıcısı bu formla sunucunuza (cep şişesi uygulaması) istek gönderir ve aşağıdaki gibi form içeriğini alabilirsiniz:

request.args.get('form_name')

1

Zaten biliyorum varsayarsak bir görünüm yazma içinde Flaskbir url'ye o cevaplarından okur tane oluşturun request.postverileri. input boxBu gönderiye verilerini eklemek için sayfanızda metin kutusuyla bir form oluşturun. Daha sonra jqueryyapmak için kullanabilirsiniz

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

ve ardından aşağıdaki gibi bir şey kullanarak eşzamansız olarak görünümünüze yayınlayın.

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

0

Bu benim için çalıştı.

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
      }
    });
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.