#python #flask
#python #flask
Вопрос:
привет, мне нужно отобразить мои выходные данные на веб-странице flask в виде таблицы. я получаю выходные данные в этом формате прямо сейчас, где wraith
мое имя КОМПЬЮТЕРА connected / disconnected
— status
and IP
. Я сохраняю вывод клиента в logs.log
файле, затем я читаю файл и отображаю его на веб-странице следующим образом.
wraith Connected USB from IP: 127.0.0.1
wraith Disconnected USB from IP: 127.0.0.1
wraith Connected USB from IP: 127.0.0.1
Мне нужно отобразить этот вывод в формате таблицы следующим образом
CLIENT
IP
STATUS
wraith 127.0.0.1 подключен
wraith 127.0.0.1 отключен
как в этом примере
это мой клиентский код
import requests
import subprocess, string, time
import os
url = 'http://127.0.0.1:5000/'
name = os.uname()[1]
def on_device_add():
requests.post(f'{url}/device_add?name={name}')
def on_device_remove():
requests.post(f'{url}/device_remove?name={name}')
def detect_device(previous):
total = subprocess.run('lsblk | grep disk | wc -l', shell=True, stdout=subprocess.PIPE).stdout
time.sleep(3)
# if condition if new device add
if total > previous:
on_device_add()
# if no new device add or remove
elif total == previous:
detect_device(previous)
# if device remove
else:
on_device_remove()
# Infinite loop to keep client running.
while True:
detect_device(subprocess.run(' lsblk | grep disk | wc -l', shell=True , stdout=subprocess.PIPE).stdout)
это мое приложение flask
from flask import Flask, request, Response
app = Flask(__name__)
@app.route("/device_add", methods=['POST'])
def device_add():
name = request.args.get('name')
with open('logs.log', 'a') as f:
f.write(f'{name} Connected USB from IP: {request.remote_addr}n')
return 'ok'
@app.route("/device_remove", methods=['POST'])
def device_remove():
name = request.args.get('name')
with open('logs.log', 'a') as f:
f.write(f'{name} Disconnected USB from IP: {request.remote_addr}n')
return 'ok'
@app.route("/", methods=['GET'])
def device_list():
with open('logs.log', 'r') as f:
return ''.join(f'<div>{line}</div>' for line in f.readlines())
Комментарии:
1. Я не понимаю, в чем ваш вопрос. Работает ли код некорректно? Вы получаете ошибки?
2. мне нужно отобразить выходные данные в виде таблицы, как я упоминаю свой вывод, он находится в прямой строке, мне нужно прочитать файл и отобразить его в виде таблицы
3.
return ''.join(f'<div>{line}</div><br>' for line in f.readlines())
?4. да, он печатает только весь файл построчно, а не в формате таблицы
5. Потому что вы не указали какой-либо HTML-код, чтобы поместить его в таблицу. Вы заметили, что в моем последнем комментарии я поставил разрыв строки в конце? Это не будет таблицей, но она должна дать вам новые строки
Ответ №1:
Вам действительно нужно предоставить некоторый HTML, чтобы получить то, что вы хотите. Обычно у вас есть отдельный HTML-шаблон внутри каталога «templates», и вы бы использовали render_template
. В этом случае я создал шаблон в виде строки внутри скрипта python только для демонстрации, но это не является устойчивым в реальных проектах.
Синтаксис для зацикливания строк данных и вставки отдельных точек основан на Jinja2
from flask import Flask, request, render_template_string
app = Flask(__name__)
TABLE_TEMPLATE = """
<style>
table, th, td {
border: 1px solid black;
}
</style>
<table style="width: 100%">
<thead>
<th>Client</th>
<th>IP</th>
<th>Status</th>
</thead>
<tbody>
{% for row in data %}
<tr>
<td>{{ row.client }}</td>
<td>{{ row.ip }}</td>
<td>{{ row.status }}</td>
</tr>
{% endfor %}
</tbody>
</table>
"""
@app.route("/device_add", methods=['POST'])
def device_add():
name = request.args.get('name')
with open('logs.log', 'a') as f:
f.write(f'{name} Connected USB from IP: {request.remote_addr}n')
return 'ok'
@app.route("/device_remove", methods=['POST'])
def device_remove():
name = request.args.get('name')
with open('logs.log', 'a') as f:
f.write(f'{name} Disconnected USB from IP: {request.remote_addr}n')
return 'ok'
@app.route("/", methods=['GET'])
def device_list():
keys = ['client', 'ip', 'status']
data = []
with open('logs.log', 'r') as f:
for line in f:
row = line.split()
data.append(dict(zip(keys, [row[0], row[-1], row[1]])))
return render_template_string(TABLE_TEMPLATE,
data=data)