2014-10-23 12 views
11

Tôi hiện đang có một máy chủ web Flask để lấy dữ liệu từ một API JSON bằng cách sử dụng đối tượng yêu cầu được tích hợp sẵn.Có thể tự động cập nhật mẫu được hiển thị trong Flask, phía máy chủ không?

Ví dụ:

def get_data(): 
    response = requests.get("http://myhost/jsonapi") 
    ... 
    return response 

@main.route("/", methods=["GET"]) 
def index(): 
    return render_template("index.html", response=response) 

Vấn đề ở đây là một cách tự nhiên các phương thức GET chỉ chạy một lần, các get_data lần đầu tiên được gọi. Để làm mới dữ liệu, tôi phải dừng và khởi động lại máy chủ Flask wsgi. Tôi đã cố gắng gói các phần khác nhau của mã trong một vòng lặp True/sleep trong khi điều này ngăn không cho người dùng tải trang.

Cách Pythonic nào nhất để tự động nhận dữ liệu tôi muốn mà không phải tải lại trang hoặc khởi động lại máy chủ?

+1

Nếu bạn sẵn sàng định tuyến phương thức 'get_data()' cho URL, bạn chỉ có thể sử dụng [AJAX] (http://api.jquery.com/jquery.ajax/) để gọi từ khách hàng và cập nhật trang với kết quả. – Celeo

+0

@Celeo là một cách. Nhưng nói rằng tôi có 'get_data()' trong một tập tin riêng biệt và tôi không muốn thêm một tuyến đường khác? Câu hỏi của tôi liên quan đến việc liệu điều này có thể được thực hiện bằng cách sử dụng Flask hay một phần mở rộng Flask. – damienstanton

+1

Bạn sẽ phải có một số cách để máy khách nhận dữ liệu từ máy chủ sau khi máy chủ đã hoàn thành mẫu. Nếu bạn chỉ muốn dữ liệu cập nhật trong nền mà không cần tương tác với khách hàng, bạn có thể thử [Celery] (http://www.celeryproject.org/). – Celeo

Trả lời

15

Bạn đang thảo luận về hai vấn đề có thể khác nhau.

  1. Giả sử vấn đề là bạn đang gọi các nguồn dữ liệu động, get_data(), chỉ một lần và giữ giá trị (tĩnh) của mình trong một thế giới response. Cuộc gọi một lần này không được hiển thị, nhưng giả sử nó ở đâu đó trong mã của bạn. Sau đó, nếu bạn sẵn sàng để làm mới trang (/) để có được cập nhật, bạn có thể sau đó:

    @main.route("/", methods=['GET']) 
    def index(): 
        return render_template("index.html", response=get_data()) 
    

    này sẽ lấy dữ liệu mới trên mỗi tải trang.

  2. Sau đó, về phía cuối câu hỏi của bạn, bạn hỏi cách "Lấy dữ liệu tôi muốn mà không phải tải lại trang hoặc khởi động lại máy chủ". Đó là một vấn đề hoàn toàn khác. Bạn sẽ phải sử dụng các yêu cầu AJAX hoặc WebSocket trong mã của bạn. Có một vài hướng dẫn về cách thực hiện điều này (ví dụ: this one) mà bạn có thể tìm thấy thông qua Googling "Flask AJAX". Nhưng điều này sẽ yêu cầu một cuộc gọi AJAX JavaScript. Tôi khuyên bạn nên tìm các ví dụ về cách thực hiện điều này thông qua tìm kiếm "Flask AJAX jQuery" vì jQuery sẽ trừu tượng và đơn giản hóa những gì bạn cần làm ở phía máy khách. Hoặc, nếu bạn muốn sử dụng WebSockets cho kết nối độ trễ thấp hơn giữa trang web của bạn, điều đó cũng có thể xảy ra; tìm kiếm các ví dụ (ví dụ: like this one).

+1

Điểm tốt khi tách thành hai vấn đề. Điều này trả lời cả trường hợp cụ thể của tôi và câu hỏi chung. Nó có thể có giá trị chia sẻ [Flask-SocketIO] (http://flask-socketio.readthedocs.org/) ở đây là tốt. – damienstanton

Các vấn đề liên quan