2013-03-30 6 views
20

CPU kullanımımı dinamik olarak görüntülemek istiyorum. Yeni bir değer görmek için sayfayı yeniden yüklemek istemiyorum. Python'da CPU kullanımını nasıl alacağımı biliyorum. Şu anda değer ile bir şablon oluşturuyorum. Flask'tan bir değeri olan bir sayfayı nasıl güncelleyebilirim? WebSockets Kullanarak Ajax isteği Flask'tan periyodik olarak güncelleme ve işleme

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+" %") 
       }); 
     } 

kullanma

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

+1

Sayfayı yeniden yüklememek, istemciden kod yürütmeniz gerektiği anlamına gelir; bu, ** 'nin javascript kullanmak için ** kullanmanız anlamına gelir. Ayrıca, CPU kullanımı dediğinizde sunucunuzun anlamı nedir? –

+1

Yup, CPU kullanımı hakkında bir güncelleme almak için sunucuya sorgu yapmak için JavaScript kullanmalısınız. Bunu tamamen sunucu tarafında yapmak mümkün değil. – aychedee

+4

Websocket bağlantısı kurduysanız, sunucu güncellemeleri istemciye yönlendirebilir. Ancak bağlantıyı oluşturmak ve sunucudan yapılan güncellemeleri ele almak için hala JS kullanıyor olmalısınız. – aychedee

cevap

21

Flask-WebSockets kullanma

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 

# -*- 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))) 
çok daha kolay hayatımı yaptı. İşte başlatıcısı geçerli: launchwithsockets.sh

#!/bin/sh 

gunicorn -k flask_sockets.worker app:app 

Son olarak, burada müşteri kodu: Ben socket.io gibi şeyler kullanarak DEĞİL ediyorum
custom.js
The code is a bit too long, so here it is.
Not kod uzun olmasının nedeni, işte bu. Bu kod ayrıca, sunucuya düzenli olarak yeniden bağlanmaya çalışır ve bir kullanıcı eylemine yeniden bağlanmayı denemeyi durdurabilir. Kullanıcıya bir şeylerin yanlış gittiğini bildirmek için Messenger lib kullanıyorum. Tabii ki socket.io kullanmaktan biraz daha karmaşık ama ben istemci tarafında kodlama gerçekten keyif aldım.

+0

ajax kodu bana hata veriyor Dikkat Çekilmemiş ReferenceError: $ SCRIPT_ROOT tanımlı değil – Marshall

+0

Buradaki belgelere bakın: http://flask.pocoo.org/docs/0.10/patterns/jquery/#where-is-my -site – Depado

+0

@Depado: update_values ​​() öğesini ne zaman ve nerede çağırırsınız? –