2014-10-23 4 views
11

Mam obecnie serwer internetowy Flask, który pobiera dane z interfejsu API JSON za pomocą wbudowanego obiektu żądań.Czy jest możliwa dynamiczna aktualizacja renderowanego szablonu w kolbie, po stronie serwera?

Na przykład:

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

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

Kwestia jest taka, że ​​w naturalny sposób GET jest uruchamiany tylko raz, pierwszy raz get_data nazywa. Aby odświeżyć dane, muszę zatrzymać i zrestartować serwer Flask wsgi. Próbowałem owijać różne części kodu podczas pętli True/sleep, ale to zapobiega ładowaniu strony przez werkzeug.

Jaki jest najbardziej Pythonowy sposób na dynamiczne Uzyskiwanie pożądanych danych bez konieczności ponownego ładowania strony lub restartowania serwera?

+1

Jeśli chcesz przenieść swoją metodę 'get_data()' do adresu URL, możesz po prostu użyć [AJAX] (http://api.jquery.com/jquery.ajax/), aby ją nazwać od klienta i zaktualizować stronę z wynikami. – Celeo

+0

@Celeo to jeden sposób. Ale powiedz, że mam 'get_data()' w osobnym pliku i nie chcę dodawać innej trasy? Moje pytanie dotyczy tego, czy można to osiągnąć za pomocą kolby lub rozszerzenia kolby. – damienstanton

+1

Musisz mieć sposób, aby klient pobierał dane z serwera po tym, jak serwer wyrenderował już szablon. Jeśli chcesz, aby dane były aktualizowane w tle bez interakcji z klientem, możesz spróbować [Seler] (http://www.celeryproject.org/). – Celeo

Odpowiedz

15

Omawiasz dwie różne kwestie.

  1. Załóżmy problem jest dzwonisz dynamiczne źródło danych, get_data(), tylko raz i utrzymanie jego wartości (statyczny) w globalnym response. To jednorazowe połączenie nie jest wyświetlane, ale załóżmy, że jest gdzieś w kodzie. Następnie, jeśli są chętni, aby odświeżyć stronę (/), aby uzyskać aktualizacje, można następnie:

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

    Byłoby to przynieść świeże dane na każdej stronie obciążenia.

  2. Następnie pod koniec pytania, pytasz, jak "Uzyskaj potrzebne dane bez konieczności ponownego ładowania strony lub restartowania serwera". To zupełnie inny problem. Będziesz musiał użyć żądań AJAX lub WebSocket w swoim kodzie. Istnieje wiele tutoriali na temat tego, jak to zrobić (np. this one), które można znaleźć w Googling "Flask AJAX". Ale to będzie wymagało wywołania JavaScript AJAX. Polecam znalezienie przykładów, jak to zrobić, wyszukując "Flak AJAX jQuery", ponieważ jQuery streści i uprości to, co musisz zrobić po stronie klienta. Lub, jeśli chcesz korzystać z WebSockets w celu uzyskania krótszego czasu oczekiwania na połączenie między twoją stroną internetową, jest to również możliwe; szukaj przykładów (np. like this one).

+1

Dobry punkt na rozdzielenie na dwie kwestie. Odpowiada to zarówno na mój konkretny przypadek, jak i na pytanie ogólne. Warto również udostępnić tutaj [Flask-SocketIO] (http://flask-socketio.readthedocs.org/). – damienstanton

Powiązane problemy