定期更新和渲染来自 Flask 的值

IT技术 javascript python flask jinja2
2021-01-29 22:40:52

我想动态显示我的 CPU 使用率。我不想重新加载页面以查看新值。我知道如何在 Python 中获取 CPU 使用率。现在我用这个值渲染一个模板。如何使用 Flask 中的值不断更新页面?

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

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

使用 Websocket

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

使用 Flask-Websockets 让我的生活更轻松。这是启动器: launchwithsockets.sh

#!/bin/sh

gunicorn -k flask_sockets.worker app:app

最后,这里是客户端代码:
custom.js
代码有点长,所以在这里。
请注意,我没有使用 socket.io 之类的东西,这就是代码很长的原因。此代码还尝试定期重新连接到服务器,并且可以停止尝试重新连接用户操作。我使用 Messenger 库通知用户出现问题。当然,它比使用 socket.io 复杂一些,但我真的很喜欢在客户端编写代码。

ajax 代码给了我错误 Uncaught ReferenceError: $SCRIPT_ROOT is not defined
2021-03-15 22:40:52
@secretagentmango 不返回网页,只返回 JSON。前端使用 Ajax 请求调用该路由并解析返回的 JSON。请参阅答案中的 Javascript 片段以查看示例:)
2021-03-26 22:40:52
2021-03-27 22:40:52
当您使用 jsonify 调用路由时,您返回的是哪个网页?这些信息是如何放在前端的?
2021-03-28 22:40:52
setInterval(update_values, 1000)将每秒调用该函数,请参阅:developer.mozilla.org/en-US/docs/Web/API/WindowTimers/...
2021-04-08 22:40:52