#javascript #python #flask #jinja2 #pymongo
#javascript #python #flask #jinja2 #pymongo
Вопрос:
Недавно я пытался создать панель мониторинга, которая содержит данные из mongodb с помощью flask. Но я не могу отправлять данные в chart.js . Я получил данные из mongodb и отправил в javascript и попытался выполнить цикл данных с помощью jinja2.
@app.route("/dashboard")
def dashboard():
limit = request.args.get("limit",12,type=int)
dashboardDatas = mongo.db.dashBoard
dashDatas = dashboardDatas.find().limit(limit)
return render_template("dashboard.html", dashDatas = dashDatas)
<canvas id="myChart" height="50"></canvas>
<script>
var ctx = document.getElementById('myChart').getContext('2d');
var myChart = new Chart(ctx, {
type: 'line',
data: {
labels: [ {% for item in dashDatas %}
'{{item._id}}',
{% endfor %} ],
datasets: [{
label: '# of Votes',
data: [ {% for item in dashDatas %}
{{item.logistic}},
{% endfor %}],
borderColor: [
'rgba(255, 99, 132, 1)',
],
backgroundColor: [
'rgba(255, 99, 132, 0.2)',
],
borderWidth: 0.5
}]
},
options: {
scales: {
yAxes: [{
ticks: {
beginAtZero: true
}
}]
}
}
});
</script>
И я получил пустую диаграмму. Что я сделал не так?
Комментарии:
1. У меня есть немного знаний в python, обычно в js цикл for используется для итерации, он не вернет массив обратно, я чувствую, что вы можете это проверить
2. Просто попробуйте вместо цикла передать наборы данных и метки в виде массива примерно так, и создайте массив в коде python. => вернуть render_template(«dashboard.html «, dashDatas = dashDatas, метки = метки, наборы данных = наборы данных)
3. Это помогло бы, если бы вы прикрепили сгенерированный HTML.
4. Не могли бы вы, пожалуйста, включить вывод
print(dashDatas)
(ссылка на вставку, если длинная)
Ответ №1:
Мой подход заключается в том, чтобы хранить метки и данные в списках в представлении Flask, передавать их в шаблон и преобразовывать их в JSON с tojson
помощью фильтра.
Предположим, у вас есть labels = ['a', 'b', 'c']
и data = [1, 2, 3]
, по вашему мнению. Вы можете передать их в Chart.js в вашем шаблоне как
let chart = new Chart(ctx, {
type: 'line',
data: {
labels: {{ labels|tojson }},
datasets: [{
label: 'My 1st dataset',
backgroundColor: 'rgb(255, 99, 132)',
borderColor: 'rgb(255, 99, 132)',
data: {{ data|tojson }}
}]
});
Комментарии:
1. Отлично! Можете ли вы принять ответ, чтобы другие тоже могли его найти?
2. Каким будет решение, если вы хотите иметь
.js
файл отдельно? Я полагаю, что этот шаблон jinja поддерживается только в HTML-файлах.3. Вы должны включить свой файл в
<script>
тег в своем шаблоне и передать определенный в нем список вdata
ключ ChartJS. Убедитесь, что ваш.js
файл загружен, прежде чем ссылаться на него, иначе вы получите пустую диаграмму.
Ответ №2:
Версия (библиотека) 1 chartjs имеет важные отличия от версии 2 с точки зрения удобства использования. Хорошие ссылки: . версия 1: https://blog.ruanbekker.com/blog/2017/12/14/graphing-pretty-charts-with-python-flask-and-chartjs / . версия 2: https://towardsdatascience.com/flask-and-chart-js-tutorial-i-d33e05fba845