web-dev-qa-db-fra.com

Mettre à jour et rendre une valeur de Flask périodiquement

Je souhaite afficher dynamiquement l'utilisation de mon processeur. Je ne veux pas recharger la page pour voir une nouvelle valeur. Je sais comment obtenir l'utilisation du processeur en Python. En ce moment, je rend un modèle avec la valeur. Comment puis-je continuellement mettre à jour une page avec une valeur de Flask?

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

Utiliser une requête 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+" %")
                });
        }

Utilisation de 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

L'utilisation de Flask-Websockets m'a beaucoup facilité la vie. Voici le lanceur: launchwithsockets.sh

#!/bin/sh

gunicorn -k flask_sockets.worker app:app

Enfin, voici le code client:
custom.js
Le code est un peu trop long, alors le voici.
Notez que je n'utilise PAS des choses comme socket.io, c'est pourquoi le code est long. Ce code essaie également de se reconnecter périodiquement au serveur et peut cesser d'essayer de se reconnecter lors d'une action utilisateur. J'utilise la bibliothèque Messenger pour informer l'utilisateur que quelque chose s'est mal passé. Bien sûr, c'est un peu plus compliqué que d'utiliser socket.io mais j'ai vraiment aimé coder côté client.

26
Depado