2012-06-22 4 views
24

Cerco un semplice (vale a dire, non uno che mi richiede di configurare un server separato per gestire una coda di messaggistica) modo di fare a lungo polling per una piccola interfaccia web che esegue calcoli e produce un grafico. Questo è ciò che la mia interfaccia web deve fare: richiestenon Message Queue/lungo semplice-polling in Python (e Flask)

  1. utente un grafico/dati in un interfaccia web
  2. Server viene eseguito alcuni calcoli.
  3. Mentre il server è in esecuzione calcoli, un piccolo contenitore viene aggiornato (probabilmente tramite la tecnologia AJAX/jQuery) con il progresso di calcolo (simile a quello che si farebbe in una consolle con stampa (cioè di stampa 'calcolare funzione di densità ...'))
  4. finiture calcolo e il grafico è mostrato all'utente.

Dato che il calcolo è stato eseguito sul lato server, non sono proprio sicuro di come configurarlo facilmente. Ovviamente voglio configurare un'API REST per gestire il polling, che sarebbe facile con Flask. Tuttavia, non sono sicuro di come recuperare gli aggiornamenti effettivi. Una soluzione ovvia, anche se complicata per questo scopo, sarebbe quella di impostare una coda di messaggi e fare un lungo polling. Tuttavia, non sono sicuro che questo sia l'approccio giusto per qualcosa di così semplice.

Ecco le mie domande:

  1. C'è un modo per farlo utilizzando il file system? Le prestazioni non sono un problema enorme. AJAX/jQuery può trovare messaggi da un file? Salva i progressi in qualche file .json?
  2. E il decapaggio? (Non so molto sul decapaggio, ma forse potrei sottacere un messaggio dettato e potrebbe essere letto da un'API che sta gestendo il polling).
  3. è polling anche l'approccio giusto? C'è un modello migliore o più comune per gestire questo?

Ho la sensazione che sto complicando le cose perché so che questo tipo di cose è comune sul web. Molto spesso vedo accadere cose e una piccola immagine "loading.gif" è in esecuzione mentre è in corso qualche calcolo (ad esempio, in Google Analytics).

Grazie per il vostro aiuto!

risposta

39

Ho costruito diverse applicazioni come questo utilizzando solo Flask e jQuery. Sulla base di questa esperienza, direi che il tuo piano è buono.

  1. Non utilizzare il filesystem. Si verificheranno problemi/protezioni di sicurezza JavaScript. Nell'improbabile caso in cui trovi soluzioni alternative ragionevoli, non avresti comunque nulla di portatile o scalabile. Invece, usa un piccolo framework di servizi web locali, come Flask.

  2. non lo fanno salamoia. Usa JSON. È la lingua delle app Web e delle interfacce REST. jQuery e quei bei plugin basati su jQuery per disegnare grafici, grafici e simili si aspettano JSON. È facile da usare, leggibile dall'uomo e per le app su piccola scala, non c'è motivo di andare altrove.

  3. Il polling lungo va bene per ciò che si desidera ottenere. Le applicazioni Pure HTTP hanno alcune limitazioni. E i WebSocket e simili livelli socket-ish come Socket.IO "sono il futuro". Ma trovare buoni esempi semplici dell'implementazione lato server, secondo la mia esperienza, è stato difficile.Ho cercato duro Ci sono molti esempi che ti vogliono configurare Node.js, REDIS e altri strumenti di middleware. Ma perché dovremmo creare due o tre server middleware separati? È ridicolo. Quindi il lungo sondaggio su un framework web semplice, puro come Python come Flask è la strada da percorrere IMO.

Il codice è un po 'più di un frammento, così invece di includere qui, ho messo un esempio semplificato in a Mercurial repository on bitbucket che si può liberamente rivedere, copiare o clone. Ci sono tre parti:

  • serve.py un server basato su Python/Flask
  • templates/index.html 98% HTML, modello 2% file server Flask basata renderà come HTML
  • static/lpoll.js un client basata su jQuery
+2

Ah, grazie * così * tanto per questo! Ho intenzione di dare un'occhiata al tuo codice stasera. "Ma trovare buoni esempi semplici di implementazione sul lato server è stato, secondo la mia esperienza, difficile." è l'esperienza esatta che ho avuto, quindi sono contento di sapere che non sono solo. Grazie ancora!! – aaronlevin

+0

FYI Ho provato prima questo con bottle.py (con uno script di sottoprocesso lungo) e ho avuto alcuni problemi di blocco. Con Flask funziona alla grande. Grazie! – Nate

+0

Come si sincronizzano più client con tutti i segnali contemporaneamente? – r1d3h4rd

10

Il polling lungo è stato un lavoro ragionevole prima che il semplice supporto naturale per Web Sockets arrivasse alla maggior parte dei browser e prima che fosse facilmente integrato con le applicazioni Flask. Ma qui a metà 2013, il supporto Web Socket ha fatto molta strada.

Here is an example, simile a quello precedente, ma che integra Flask e Web Sockets. Funziona in cima ai componenti del server da gevent e gevent-websocket.

Nota questo esempio non è destinato a essere un capolavoro Web Socket. Conserva molta della struttura lpoll, per renderli più facilmente confrontabili. Ma migliora immediatamente la reattività, l'overhead del server e l'interattività dell'app Web.