Gửi dữ liệu từ hộp văn bản vào Flask?


92

Tôi đã tự hỏi liệu có cách nào để lấy thứ gì đó từ hộp văn bản trong HTML, nạp nó vào bình, sau đó phân tích cú pháp dữ liệu đó bằng Python. Tôi đã nghĩ điều này có thể liên quan đến một số JS nhưng tôi có thể sai. Có ý kiến ​​gì không?


Tại sao không sử dụng một biểu mẫu HTML và ĐĂNG nó trực tiếp? Hay bạn cần thực hiện điều này một cách không đồng bộ? Trong trường hợp đó, bạn sẽ phải đọc một số thứ trên AJAX. :-)
Martijn Pieters

1
Tôi biết mình có thể sử dụng biểu mẫu HTML, nhưng làm cách nào để chuyển thông tin đó vào ứng dụng bình?
ollien

Câu trả lời:


154

Trừ khi bạn muốn làm điều gì đó phức tạp hơn, việc cung cấp dữ liệu từ biểu mẫu HTML vào Flask khá dễ dàng.

  • Tạo một dạng xem chấp nhận yêu cầu POST ( my_form_post).
  • Truy cập các phần tử biểu mẫu trong từ điển 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

Đây là tài liệu Flask về cách truy cập dữ liệu yêu cầu .

Nếu bạn cần các biểu mẫu phức tạp hơn cần xác thực thì bạn có thể xem qua WTFormscách tích hợp chúng với Flask .

Lưu ý: trừ khi bạn có bất kỳ hạn chế khác, bạn không thực sự cần JavaScript ở tất cả để gửi dữ liệu của bạn (mặc dù bạn có thể sử dụng nó).


1
Này, điều này đã hiệu quả, một lần, nhưng sau đó phát sinh lỗi 500, bạn có ý kiến ​​gì không?
ollien

Nó sẽ hoạt động tốt ... Đặt app.debug = Truengay trước app.run()để bạn có được ngoại lệ và truy xuất lỗi.
pacha

Vâng, tôi quên mất điều đó, tôi là một thằng ngốc và quên đặt HTML của tôi vào thư mục mẫu của tôi.
ollien

Tôi lãng phí một chút thời gian để làm điều này với một textarea lớn hơn thay vì textbox nếu nhu cầu bất cứ ai để làm điều này với Flask giải pháp là đây
thảo quả

@cardamom Tôi thực sự không hiểu ý bạn. Sử dụng một vùng văn bản hoặc kiểu nhập văn bản không thay đổi giải pháp theo bất kỳ cách nào (giải pháp bạn đang liên kết giống hệt như giải pháp này). Bạn không cần phải thay đổi bên Python, chỉ cần thay thế <input type="text" name="text">bằng <textarea name="text"></textarea>và bạn sẽ ổn.
pacha

9

Khai báo một điểm cuối Flask để chấp nhận kiểu đầu vào POST và sau đó thực hiện các bước cần thiết. Sử dụng jQuery để đăng dữ liệu.

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

Tất cả tương tác giữa máy chủ (ứng dụng flask của bạn) và máy khách (trình duyệt) sẽ theo yêu cầu và phản hồi. Khi người dùng nhấn nút gửi trong biểu mẫu của bạn, trình duyệt của họ sẽ gửi yêu cầu với biểu mẫu này đến máy chủ của bạn (ứng dụng bình) và bạn có thể nhận được nội dung của biểu mẫu như:

request.args.get('form_name')

1

Giả sử bạn đã biết làm thế nào để viết một cái nhìn trong Flasktrả lời rằng đến một url, tạo một mà đọc request.postdữ liệu. Để thêm input boxdữ liệu vào bài đăng này, hãy tạo một biểu mẫu trên trang của bạn với hộp văn bản. Sau đó, bạn có thể sử dụng jqueryđể làm

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

và sau đó đăng lên chế độ xem của bạn một cách không đồng bộ bằng cách sử dụng một cái gì đó như bên dưới.

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

0

Điều này đã làm việc cho tôi.

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
      }
    });
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.