2013-03-30 14 views
20

Desidero visualizzare l'utilizzo della CPU in modo dinamico. Non voglio ricaricare la pagina per vedere un nuovo valore. So come ottenere l'utilizzo della CPU in Python. In questo momento visualizzo un modello con il valore. Come posso aggiornare continuamente una pagina con un valore di Flask?Aggiornamento e rendering periodico di un valore da Flask

@app.route('/show_cpu') 
def show_cpu(): 
    cpu = getCpuLoad() 
    return render_template('show_cpu.html', cpu=cpu) 
+1

non ricaricare la pagina significa che devi eseguire codice dal client, il che significa che ** devi ** usare javascript. Inoltre, quando dici che uso della CPU intendi il tuo server? –

+1

Sì, devi usare JavaScript per fare una query al server per ottenere un aggiornamento sull'utilizzo della CPU. Non è possibile farlo interamente dal lato server. – aychedee

+4

Se si è stabilita una connessione web socket, il server potrebbe inviare aggiornamenti al client. Ma si dovrebbe comunque utilizzare JS per creare la connessione e gestire gli aggiornamenti dal server. – aychedee

risposta

21

Utilizzando una richiesta Ajax

Python

@app.route('/_stuff', methods= ['GET']) 
def stuff(): 
    cpu=round(getCpuLoad()) 
    ram=round(getVmem()) 
    disk=round(getDisk()) 
    return jsonify(cpu=cpu, ram=ram, disk=disk) 

Javascript

function update_values() { 
      $SCRIPT_ROOT = {{ request.script_root|tojson|safe }}; 
      $.getJSON($SCRIPT_ROOT+"/_stuff", 
       function(data) { 
        $("#cpuload").text(data.cpu+" %") 
        $("#ram").text(data.ram+" %") 
        $("#disk").text(data.disk+" %") 
       }); 
     } 

Utilizzando WebSockets

project/app/views/request/websockets.py

# -*- coding: utf-8 -*- 

# OS Imports 
import json 

# Local Imports 
from app import sockets 
from app.functions import get_cpu_load, get_disk_usage, get_vmem 

@sockets.route('/_socket_system') 
def socket_system(ws): 
    """ 
    Returns the system informations, JSON Format 
    CPU, RAM, and Disk Usage 
    """ 
    while True: 
     message = ws.receive() 
     if message == "update": 
      cpu = round(get_cpu_load()) 
      ram = round(get_vmem()) 
      disk = round(get_disk_usage()) 
      ws.send(json.dumps(dict(received=message, cpu=cpu, ram=ram, disk=disk))) 
     else: 
      ws.send(json.dumps(dict(received=message))) 

project/app/__init__.py

# -*- coding: utf-8 -*- 
from flask import Flask 
from flask_sockets import Sockets 


app = Flask(__name__) 
sockets = Sockets(app) 
app.config.from_object('config') 
from app import views 

Utilizzando Flask-WebSockets ha reso la mia vita molto più facile. Ecco il programma di avvio: launchwithsockets.sh

#!/bin/sh 

gunicorn -k flask_sockets.worker app:app 

Infine, ecco il codice del client:
custom.js
The code is a bit too long, so here it is.
Si noti che non sto usando cose come socket.io, è per questo che il codice è lungo. Questo codice tenta inoltre di riconnettersi periodicamente al server e può interrompere il tentativo di riconnettersi su un'azione dell'utente. Io uso la lib Messenger per avvisare l'utente che qualcosa è andato storto. Ovviamente è un po 'più complicato dell'uso di socket.io ma mi è piaciuto molto codificare il lato client.

+0

Il codice ajax mi dà l'errore Uncaught ReferenceError: $ SCRIPT_ROOT non è definito – Marshall

+0

Dai un'occhiata alla documentazione qui: http://flask.pocoo.org/docs/0.10/patterns/jquery/#where-is-my -site – Depado

+0

@Depado: quando e dove richiamare update_values ​​()? –

Problemi correlati