Вот то, что я пытался. У меня не было проблем с зависанием сервера после обновления или открытия новой вкладки ссылки. Однако после того, как я выключил сервер (Ctrl + C
), консоль вызвала некоторые исключения, которые указывают на то, что mpld3 или matplotlib открыли некоторые новые потоки. В частности, исключение составляет RuntimeError: main thread is not in main loop
.
Я немного погуглил и наткнулся на эту ссылку . Парень предложил использовать fig_to_dict
с json
. Я попробовал его решение, и все еще получал исключение.
Теперь я собираюсь записать оба подхода и позволить вам решить, какой использовать. Я не знаю, будет ли кто-нибудь из них работать на вас. Для моей настройки приложение работает нормально, несмотря на исключения после закрытия сервера.
Я также собираюсь использовать ваш пример, который не читал текстовый файл. У меня установлено отладочное значение True
, поэтому я могу убедиться, что запросы GET обрабатываются при обновлении диаграммы или открытии нового экземпляра ссылки.
Подход 1 (fig_to_html)
app.py
from flask import Flask
from flask import render_template
import matplotlib.pyplot as plt
import mpld3
app = Flask(__name__, template_folder='/path/to/templates')
@app.route("/")
@app.route("/index")
def index():
return render_template('frontpage.html')
@app.route('/temperature')
def temperature():
date = ([1, 2, 3, 4])
y = ([1, 2, 3, 4])
fig = plt.figure(figsize=(10, 5))
plt.title('Temperature', fontsize=15)
plt.ylabel('Temperature' + u'\u2103', fontsize=15)
plt.plot(date, y, 'b-')
plt.ylim([0, 40])
myfig = mpld3.fig_to_html(fig, template_type='simple')
plt.clf() # clear figure
plt.cla() # clear axes
plt.close('all') # close all figures
# Print as HTML
return myfig
if __name__ == "__main__":
app.run(debug=True) # run on debug mode
Подход 2 (fig_to_dict)
app.py
from flask import Flask
from flask import render_template
import matplotlib.pyplot as plt
import mpld3
import json
app = Flask(__name__, template_folder='/path/to/templates')
@app.route("/")
@app.route("/index")
def index():
return render_template('frontpage.html')
@app.route('/temperature')
def temperature():
date = ([1, 2, 3, 4])
y = ([1, 2, 3, 4])
fig = plt.figure(figsize=(10, 5))
plt.title('Temperature', fontsize=15)
plt.ylabel('Temperature' + u'\u2103', fontsize=15)
plt.plot(date, y, 'b-')
plt.ylim([0, 40])
single_chart = dict()
single_chart['id'] = "temp_figure"
single_chart['json'] = json.dumps(mpld3.fig_to_dict(fig))
plt.clf() # clear figure
plt.cla() # clear axes
plt.close('all') # close figure
# Print as HTML
return render_template('temperature.html', single_chart=single_chart)
if __name__ == "__main__":
app.run(debug=True) # run on debug mode
А вот и файлы шаблонов. Я заметил, что вы использовали статическую ссылку в вашем frontpage.html
, поэтому я заменил ее заполнителем, который позволяет Flask автоматически заполнять URL. У вас также был тег div
, который вы не закрывали.
frontpage.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Envic Oy Cloud</title>
</head>
<body>
<div class="headers">
<h1>Web-Application</h1>
<h2> Version 0.0.1 </h2>
</div>
<div class="buttons"></div>
<h3 class="buttonheader">Logger 1</h3>
<a class="templink" href="{{ url_for('temperature') }}" target="_blank"> Check temperature </a>
</body>
</html>
Temperature.html (только для 2-го захода на посадку)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Sample Page</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<script type="text/javascript" src="http://d3js.org/d3.v3.min.js"></script>
<script type="text/javascript" src="http://mpld3.github.io/js/mpld3.v0.2.js"></script>
</head>
<body>
<div id="{{single_chart.id}}">
</div>
<script type="text/javascript">
var figureId = "{{single_chart.id}}";
var json01 = {{single_chart.json|safe}};
mpld3.draw_figure(figureId, json01);
</script>
</body>
</html>
Кстати, я использую Python 3.5.4, Flask == 0.12.2, matplotlib == 2.1.2 и mpld3 == 0.3. Я тестировал с использованием Chrome версии 67.0.3396.87.