Squeak.ru - шаблоны программирования

Использование данных, сохраненных как переменная в HTML из Python

Возможно ли, чтобы переменная, определенная в файле Python, передавалась в файл html в том же каталоге и использовалась в теге script?

Синопсис: я создаю фляжный веб-сайт, который извлекает данные из базы данных и использует их для создания линейной диаграммы в chartjs. Flask использует jijna для управления шаблонами. Данные в базе данных были нормализованы, чтобы их можно было прочитать скриптом диаграммы (метка находится в списке, данные в виде кортежа). До сих пор я создавал маршруты, чтобы можно было получить доступ к каждой странице, и передать значение в параметр return_template, как показано здесь:

@app.route('/room2')
def room2():
    return render_template('room2.html', title = 'Room2', time = newLabel, count = newData )

с html для вызываемой комнаты вместе с заголовком, доступ к которому осуществляется здесь:

{% if title %}
    <title>Website title - {{ title }}</title>
{% else%}
    <title>Website</title>
{% endif %}

Диаграмма создается в файле html, и я хочу взять данные (время и количество) и использовать их в сценарии так же, как используется заголовок. Однако скрипт для chart.js не принимает {{ }} (что в любом случае является функцией печати). До сих пор мне удалось получить данные, которые я хочу, В необходимый html-файл, что подтверждается данными, распечатываемыми на самой странице, но я не уверен, как перевести их в переменную, которая будет использоваться диаграммами.

Какие-либо предложения? (ПРИМЕЧАНИЕ: использование таких маршрутов может быть неправильной отправной точкой, но это имеет логический смысл и не привело к каким-либо ошибкам, кроме логических)

Файлы:

  • data.py: берет информацию из базы данных и преобразует ее в две переменные;
label = ['09:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00']
data = ['4,7,2,3,9,9,5]
  • route.py: содержит маршруты ко всем страницам,
  • layout.html: содержит общий html-код для веб-сайта,
  • room.html: содержит график, простирается от макета

  • Вы не можете использовать выражения Jinja в статически загруженном файле script.js. Вам либо нужно поместить блок <script> в template с помощью JS, например var myVar = {{variable}};, либо другим хорошим методом будет это answer, который использует атрибут данных тега HTML и извлекает его в коде Javascript. Однако для загрузки более сложных объектов (соединений x, y и т. д.) может быть целесообразно использовать API выборки для создания отдельного запроса при загрузке страницы. Я посмотрю, смогу ли я написать ответ, демонстрирующий последний метод. 08.05.2020
  • @ v25 я использую выражение jinja в html-файле, и данные отправляются туда через @app.route('/room2') в py-файле, но я попытаюсь сделать переменную, как было предложено (плохо использовать let вместо var, хотя они, вероятно, взаимозаменяемы, верно ?) Спасибо за написание демонстрации, я думаю, это поможет мне понять, что вы имеете в виду. 08.05.2020
  • @v25, поэтому я использовал let myVar = '{{variable}}'; (получал ошибку, если там не было одинарных кавычек) в скрипте, который распечатывал график, но интересным образом: линии линейного графика не были связаны друг с другом, а метки в ось Y была неправильной (добавит изображение в сообщение, чтобы показать обновление) 08.05.2020
  • Я добавил подробный ответ с разумным подходом. Если у вас возникли проблемы с переносом ваших данных в этот формат в Python, отредактируйте свой вопрос с образцом данных (а не скриншотами), и я буду рад помочь. 08.05.2020
  • Извините за долгое ожидание, доделывал другие требования к проекту. То, как вы все объяснили, было действительно полезным, спасибо, поэтому, пока я смотрю на ваш репозиторий и смотрю, смогу ли я применить то, что вы мне сказали, я добавлю набор данных, различные корни и текущие файлы и что они содержат. 09.05.2020
  • @v25 потребовалось некоторое время, но я справился, спасибо за помощь 09.05.2020

Ответы:


1

Для новичков, которые пытаются объединить Flask и ChartJS, общий подход, похоже, заключается в написании кода Jinja, который использует циклы для вывода Javascript, или вручную использует выражения Jinja в JS. Это может быстро превратиться в кошмар обслуживания.

Вот мой подход, который позволяет вам определить данные, которые вы хотите отобразить на диаграмме в Python, поместить холст в свой шаблон с минимальным JS, а затем динамически обновлять диаграмму с помощью Javascript Fetch API.

Вы можете клонировать репозиторий flask-chartjs.

У вас может быть один маршрут, который отображает страницу, содержащую диаграмму:

@app.route('/')
def index():
    return render_template('index.html', CHART_ENDPOINT = url_for('data'))

CHART_ENDPOINT в этом случае будет /data, что соответствует другому маршруту, который возвращает JSON. У меня также есть вспомогательная функция, которая преобразует время эпохи в формат, совместимый с ISO 8601, который работает с моментом.

import datetime as DT
def conv(epoch):
    return DT.datetime.utcfromtimestamp(epoch).isoformat()

@app.route('/data')
def data():
    d = {'datasets':
            [
                {'title': 'From Dict',
                 'data': [ {'x': conv(1588745371), 'y': 400},
                           {'x': conv(1588845371), 'y': 500},
                           {'x': conv(1588946171), 'y': 800} ]
                },
            ]
         }

    return jsonify(d)

Теперь в шаблоне можно разместить элемент холста графика с атрибутом data-endpoint:

<canvas id="canvas" data-endpoint='{{CHART_ENDPOINT}}'></canvas>

Затем я реализовал две функции JS, которые в том же шаблоне позволяют вам создать диаграмму и загрузить данные из предоставленной конечной точки:

<script type='text/javascript'>
    var ctx = document.getElementById('canvas');

    myChart = create_chart(ctx);

    window.onload = function () { 
      load_data(myChart)
    };
</script>

В create_chart функция конечная точка получается из атрибута data-endpoint и добавляется к объекту config до того, как он будет назначен этой диаграмме (кредит):

config.endpoint = ctx.dataset.endpoint;
return new Chart(ctx.getContext('2d'), config);

Затем функция load_data получает доступ к конечной точке из chart.config.endpoint, что означает, что она всегда получает правильные данные для предоставленной диаграммы.


Вы также можете установить единицы времени, когда создание диаграммы:

myChart = create_chart(ctx, 'hour') # defaults to 'day'

Я обнаружил, что обычно это нужно настраивать в зависимости от вашего диапазона данных.

Было бы тривиально изменить этот код, чтобы получить его таким же образом, как и конечную точку, в функции create_chart. Что-то вроде config.options.scales.xAxes[0].time.unit = ctx.datasets.unit, если атрибут был data-unit. Это же можно сделать и для других переменных.


Вы также можете передать строку из внешнего интерфейса при загрузке данных (скажем, dynamicChart — это еще одна диаграмма, созданная с помощью метода, описанного выше):

load_data(dynamicChart, 'query_string')

Это сделало бы 'query_string' доступным в функции flask как request.args.get('q')

Это полезно, если вы хотите реализовать (например) поле ввода текста, которое отправляет строку на серверную часть, чтобы серверная часть могла каким-то образом обработать ее и вернуть настроенный набор данных, который отображается на диаграмме. Маршрут /dynamic в репозитории демонстрирует это.

Вот как это выглядит в рендере:

отображенная диаграмма

Как видите, на одной странице также можно разместить несколько диаграмм.

08.05.2020

2

Вы можете использовать ту же функцию шаблонов jinja для доступа к вашей переменной в js.

Возможно, если вам нужны строки, вы должны заключить их вот так "{{variable}}"

08.05.2020
  • @Code_Yard Я попытался поместить переменную в скобки {{ }} и поместить ее в нужное место в сценарии, но я получил сообщение об ошибке (я обновлю вопрос, чтобы показать вам) 08.05.2020
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...