通过Flask / Python读取文本文件并以HTML格式显示的正确方法是什么?

时间:2016-05-11 22:15:42

标签: python html flask jinja2

具体来说,让我们谈谈我们想要用HTML显示的大型文本/日志文件。我见过各种方法,但出于可伸缩性的目的,

我想做的是获取一个包含空格分隔数据的日志文件,然后将其放入以HTML格式显示的表格中。

文本文件中的示例:

2016-05-10 21:13:56.030616 Button_Pressed
2016-05-10 21:14:44.534093 Door_Opened
2016-05-10 21:14:46.850801 Button_Pressed
2016-05-10 21:15:04.383880 Door_Closed

我想把每一行转换成标题为“日期,时间,事件”的表格。

简单的方法是使用某种列表,我们将每行读入列表,然后在返回时将列表传递给HTML。

Flask网络应用程序(app.py)中的Python代码摘录:

@app.route('/history')
def history():

    with open('events.log') as event_log:
    event_lines = event_log.readlines()

    door_history = []
    events = len(event_lines)

    for x in range(events):
        door_history.append(event_lines[x].split(" "))

    return render_template('door-log.html', events=events, door_history=door_history)

示例HTML / Jinja代码摘录自Flask Web应用程序(door-log.html)

<table>
    <tr>
        <th>Date</th>
        <th>Time</th>
        <th>Event</th>
    </tr>

    {% for row in range(events) %}
        <tr>
            {% for column in range(3) %}
            <td> {{ door_history[row][column] }} </td>
            {% endfor %}
        </tr>
    {% endfor %}
</table>

然而,对于这种方法,这不是最好的内存使用吗?如果你有很多人访问同一页面,它会扩展吗?这是做这种事的正确方法吗?

1 个答案:

答案 0 :(得分:0)

我不会说你的方式正是这样做的正确方法。然而,对于小型应用程序,它将比大多数其他解决方案更快地工作并且更快。

如果您的日志文件随着时间的推移而增长,您将不希望完整地显示它。相反,您可能希望仅实现显示最新的10个左右事件,提供包含更多事件(分页)的第二个页面。 在这种情况下,您可能仍然可以使用上述解决方案的改编版本。

但是,如果您有很多页面浏览量或想要拥有高级功能,例如:显示活动的最后一周,只显示开门事件或显示第一个日历周内发生的所有开门事件。然后,您希望通过将数据导入某种数据库来使数据更易于访问。

你可以使用SQLite作为数据库,但如果你真的有很多用户,像PostgreSQL这样的东西会是更好的选择。您不会在视图中导入数据,而是运行专用任务,以便再次更新数据库。在最简单的情况下,这可能是每分钟运行一次的cronjob。您也可以使用像celery这样的更高级的解决方案,在任何一种情况下,您最终可能会在数据库中产生稍微过时的数据,因此您的网站也不会有这种方法。

有关如何将数据库集成到应用程序中的信息,请参阅official flask documentation。 有关celery的更多信息(用于常规数据库更新),请查看flask documentation on the topic。如here所解释的那样,稍微更加苛刻的方式就是cron工作。

所有这一切:如果这只是一个简单的家庭项目而你没有学习经验,那么你现在的解决方案将100%足够。 如果您有兴趣学习更多或想要很多人使用