Данные не обновляются при обновлении страницы в бутылке Python? - PullRequest
0 голосов
/ 16 мая 2019

Я запускаю скрипт, который отображает некоторые данные в бутылке Python, одна из них - уровень сигнала, который я хотел бы показать в режиме реального времени. Когда я обновляю страницу, значение не меняется, поэтому мне нужно перезапустить сервер, чтобы обновить уровень сигнала. Я пробовал Ajax, но кажется, что он не работает. Что я должен использовать, чтобы это работало?

РЕДАКТИРОВАТЬ: переменные являются списками, которые приходят из другого файла.

iplist = [192.168.1.1, 192.168.1.2]
hostlist = [android234567, android677896]
maclist = [a1:b2:c3:d4:e5:f6, a1:b2:c3:d4:e5:f6]
signallist = [-56, 23]

.

@app.route('/')
def index():
    info={'iplist': iplist, 'maclist': maclist, 'signallist': signallist, 'hostlist': hostlist}
    tpl = '''
    <!DOCTYPE html>
    <html>
    <head>
        <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
        <script type="text/javascript">
            function ajax(){
                var req = new XMLHttpRequest();
                req.onreadystatechange = function(){
                    if (req.readyState == 4 && req.status == 200) {
                    document.getElementById('signallist').innerHTML = req.responseText;
                    }
                }
                req.open('REQUEST', '../connectedDevices.py', true);
                req.send();
            }
            (function(){ajax();}, 1000);
        </script>
    </head>

    <body onload="ajax();">
        <table>
            <tr>
                <td>IP address</td>
                <td>Hostname</td>
                <td>MAC address</td>
                <td>Signal</td>
            </tr>
            %for i in range(len(maclist)):
                <tr>
                    <td>{{iplist[i]}}</td>
                    <td>{{hostlist[i]}}</td>
                    <td>{{maclist[i]}}</td>
                    <td id="signallist">{{signallist[i]}}</td>
                </tr>
            %end
        </table>
    </body>
    </html>
    '''
    return template(tpl, info)

Это печатает диаграмму, где он показывает Ip, хост, mac и сигнал, который я хочу обновить в режиме реального времени.

1 Ответ

0 голосов
/ 16 мая 2019

Бутылка кеширует шаблоны. Поэтому, если вы вводите значения во время создания шаблона, он будет кешировать эти значения.

from bottle import TEMPLATES
TEMPLATES.clear()

Сброс тех.

Однако вы действительно должны подумать о том, куда поступают ваши данные, и использовать веб-сокеты. gevent имеет большую библиотеку веб-сокетов и прекрасно работает с bottle, чтобы сделать ваш код асинхронным. Немного поработав с javascript, вы сможете запрашивать ваши API и передавать данные в реальном времени в ваш код.

...