2014-10-23 7 views
11

Attualmente dispongo di un server Web Flask che estrae i dati da un'API JSON utilizzando l'oggetto di richieste incorporato.È possibile aggiornare dinamicamente un modello renderizzato in Flask, lato server?

Ad esempio:

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

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

Il problema qui è che, naturalmente, il metodo GET viene eseguito solo una volta, la prima volta get_data si chiama. Per aggiornare i dati, devo interrompere e riavviare il server wsgi Flask. Ho provato a racchiudere varie parti del codice in un ciclo True/sleep while, ma questo impedisce a werkzeug di caricare la pagina.

Qual è il modo più Python per ottenere in modo dinamico i dati desiderati senza dover ricaricare la pagina o riavviare il server?

+1

Se siete disposti a instradare il vostro get_data metodo '() a un URL, si potrebbe utilizzare [AJAX] (http://api.jquery.com/jquery.ajax/) chiamarlo dal client e aggiornare la pagina con i risultati. – Celeo

+0

@Celeo è a senso unico. Ma diciamo che ho 'get_data()' in un file separato e non voglio aggiungere un altro percorso? La mia domanda riguarda se questo può essere ottenuto usando l'estensione Flask o Flask. – damienstanton

+1

Dovrai avere un modo per il client di ottenere dati dal server dopo che il server ha già reso il modello. Se desideri semplicemente che i dati vengano aggiornati in background senza interazione con il client, puoi provare con [Celery] (http://www.celeryproject.org/). – Celeo

risposta

15

Stai discutendo di quali potrebbero essere due problemi diversi.

  1. Supponiamo il problema è che si sta chiamando l'origine dei dati dinamici, get_data(), solo una volta e mantenere il suo valore (statica) in una globale response. Questa chiamata una tantum non viene mostrata, ma diciamo che è da qualche parte nel tuo codice. Poi, se si è disposti a aggiornare la pagina (/) per ottenere gli aggiornamenti, si potrebbe quindi:

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

    Ciò recuperare i dati freschi su ogni caricamento della pagina.

  2. Quindi verso la fine della domanda, si chiede come "OTTENERE i dati desiderati senza dover ricaricare la pagina o riavviare il server". Questa è una questione completamente diversa. Dovrai utilizzare le richieste AJAX o WebSocket nel tuo codice. Esistono alcuni tutorial su come eseguire questa operazione (ad esempio this one) che puoi trovare tramite Google "Flask AJAX". Ma ciò richiederà una chiamata AJAX JavaScript. Raccomando di trovare esempi di come questo viene fatto attraverso la ricerca di "Flask AJAX jQuery" poiché jQuery astrarrà e semplificherà ciò che è necessario fare sul lato client. Oppure, se si desidera utilizzare WebSockets per la connessione a bassa latenza tra la pagina Web, è anche possibile; cercare esempi (ad esempio like this one).

+1

Buon punto per la separazione in due problemi. Questo risponde sia al mio caso specifico che alla domanda generale. Può valere la pena condividere [Flask-SocketIO] (http://flask-socketio.readthedocs.org/) anche qui. – damienstanton

Problemi correlati