как отобразить выходные данные в таблице из файла с помощью flask

#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)