通过 Flask/Python 读取文本文件并显示在 HTML 中的正确方法是什么?
What is the proper way to read a text file and display in HTML via Flask/Python?
具体来说,让我们谈谈我们想要在 HTML 中显示的大型 text/log 文件。我见过各种方法,但出于可扩展性目的,
我想做的是获取一个包含 space 分隔数据的日志文件,然后将其放入 table 中显示在 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
我想把每一行都转换成带有标题 "Date, Time, Event" 的 table。
最简单的方法是使用某种列表,我们将每一行读入列表,然后将列表传递给 return 上的 HTML。
示例 Python 来自 Flask 网络应用程序 (app.py) 的代码摘录:
@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 网络应用程序的代码摘录 (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>
但是,对于这种方法,这不是对内存的最佳利用吗?如果你有很多人访问同一个页面,它会扩展吗?这是做这种事情的正确方法吗?
我不会说你的方法就是正确的方法。但是,对于小型应用程序,它可以工作并且比大多数其他解决方案更快。
如果您的日志文件随着时间的推移而增长,您可能不想完整地显示它。相反,您可能希望只显示最近的 10 个左右的事件,提供包含更多事件的第二页(分页)。
在这种情况下,您可能仍然可以使用上述解决方案的改编版本。
但是,如果您有很多页面浏览量或想要具有高级功能,例如:显示最后一周的事件、仅显示开门事件或显示第一个日历周内发生的所有开门事件。然后,您可能希望通过将数据导入某种数据库来使数据更易于访问。
您可能会使用 SQLite 作为数据库,但如果您确实有很多用户,那么 PostgreSQL 之类的数据库将是更好的选择。您不会在视图中导入数据,而是会有一个专门的任务 运行 不时更新您的数据库。在最简单的情况下,这可能是一个每分钟运行一次的 cronjob。您也可以使用更高级的解决方案,如芹菜,在任何一种情况下,您的数据库和您的网站中的数据都可能会稍微过时,没有真正解决这个问题的方法。
有关如何将数据库集成到您的应用程序的信息,请参阅 official flask documentation。
有关芹菜的更多信息(用于定期数据库更新),请查看 flask documentation on the topic. The slightly more hacky way to do this would be cron jobs, as explained here.
综上所述:如果这只是一个简单的家庭项目,并且您不希望获得学习经验,那么您当前的解决方案将 100% 足够。
如果您有兴趣了解更多或希望很多人使用
具体来说,让我们谈谈我们想要在 HTML 中显示的大型 text/log 文件。我见过各种方法,但出于可扩展性目的,
我想做的是获取一个包含 space 分隔数据的日志文件,然后将其放入 table 中显示在 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
我想把每一行都转换成带有标题 "Date, Time, Event" 的 table。
最简单的方法是使用某种列表,我们将每一行读入列表,然后将列表传递给 return 上的 HTML。
示例 Python 来自 Flask 网络应用程序 (app.py) 的代码摘录:
@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 网络应用程序的代码摘录 (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>
但是,对于这种方法,这不是对内存的最佳利用吗?如果你有很多人访问同一个页面,它会扩展吗?这是做这种事情的正确方法吗?
我不会说你的方法就是正确的方法。但是,对于小型应用程序,它可以工作并且比大多数其他解决方案更快。
如果您的日志文件随着时间的推移而增长,您可能不想完整地显示它。相反,您可能希望只显示最近的 10 个左右的事件,提供包含更多事件的第二页(分页)。 在这种情况下,您可能仍然可以使用上述解决方案的改编版本。
但是,如果您有很多页面浏览量或想要具有高级功能,例如:显示最后一周的事件、仅显示开门事件或显示第一个日历周内发生的所有开门事件。然后,您可能希望通过将数据导入某种数据库来使数据更易于访问。
您可能会使用 SQLite 作为数据库,但如果您确实有很多用户,那么 PostgreSQL 之类的数据库将是更好的选择。您不会在视图中导入数据,而是会有一个专门的任务 运行 不时更新您的数据库。在最简单的情况下,这可能是一个每分钟运行一次的 cronjob。您也可以使用更高级的解决方案,如芹菜,在任何一种情况下,您的数据库和您的网站中的数据都可能会稍微过时,没有真正解决这个问题的方法。
有关如何将数据库集成到您的应用程序的信息,请参阅 official flask documentation。 有关芹菜的更多信息(用于定期数据库更新),请查看 flask documentation on the topic. The slightly more hacky way to do this would be cron jobs, as explained here.
综上所述:如果这只是一个简单的家庭项目,并且您不希望获得学习经验,那么您当前的解决方案将 100% 足够。 如果您有兴趣了解更多或希望很多人使用