Задать вопрос
@Hkdsk

Вывод данных в Flask?

Добрый вечер. Прошу помощи, так как не нашел в интернете ответа. Имеются данные - словари сохраненные в файлы. Я их могу открыть, перебором всех файлов в папке. Но передать нормально в Flask не выходит. А именно при переборе словарей, я хочу каждый словарь(данные в нем) выводить на страницу. На выходе имею только вывод данных последнего словаря. Думаю нужно учить мать часть Flask, но надеюсь на помощь...

Мой код в python
@app.route("/monitoring")
def index(): 
    title = "START:"
    # Открываем файлы
    WATCH_DIRECTORY = 'data'
    for filename in os.listdir(WATCH_DIRECTORY):
        file_data = os.path.join(WATCH_DIRECTORY, filename)
        try:
            with open(file_data, 'rb') as file:
                data_local = pickle.load(file)
                file.close()
                print(data_local) # Здесь я нормально получаю вывод всех данных словарей.
                g.data_local = data_local
                return g.data_local().all() # Это нахимичил сам...

        except Exception as e:
            print(e)
    return render_template("monitoring.html", thetitle=title, temps=temp, peopls=g.data_local, year=datetime.date.today().year)


<table>
	{% for peopl in peopls %}
    <tr><td>{{ peopl.temp1 }}</td>
		<td>{{ peopl.znac1 }}</td></tr>
		 {% endfor %}</table></div>
		<div></div>
На выходе после этого я ничего не получаю... пустые блоки.

		{% if peopls%}
		{{ peopls.znac1 }}
		{% endif %}
Здесь удается получить только последнего словаря данные..
  • Вопрос задан
  • 1961 просмотр
Подписаться 2 Простой Комментировать
Решения вопроса 1
skipirich
@skipirich
проходил мимо
Создай до цикла, например сразу за WATCH_DIRECTORY = 'data' переменную people = []
вот эту строку g.data_local = data_local замени на people.append(data_local) ну и в render вот это peopls=g.data_local замени на peopls=people
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
deepblack
@deepblack Куратор тега Python
for filename in os.listdir(WATCH_DIRECTORY):
        file_data = os.path.join(WATCH_DIRECTORY, filename)
        try:
            with open(file_data, 'rb') as file:
                data_local = pickle.load(file)
                file.close()
                print(data_local) # здесь вывод данных с одного файла, открытого в данный момент
                g.data_local = data_local # здесь значение g.data_local затирается последним (на каждой итерации)
                return g.data_local().all()


У вас на каждой итерации цикла, значение g.data_local затирается
и в результате в шаблон вьюхи попадают данные только из последнего файла
Ответ написан
Комментировать
@Zanak
1. Не очень понял, зачем вы использовали g. Просто для накопления данных в процессе обработки хватило бы и обычной переменной, а для хранения данных между запросами она не применима (Смотрите замечание на этот счет).
2. Если вы сами ловите исключение, то и обрабатывать его лучше полностью, с указанием шаблона и кода ответа. На вашу проблему это не влияет, но это просто хорошая привычка, не делать ни чего, или доделывать до конца.
3. Что подразумевает return внутри блока with? Если объявить переменную аккумулятор значений из файлов выше цикла по файлам, и вместо g.data_local ... и return ... написать код отправки прочитанного значения в накопитель, например как здесь, а потом передать содержимое аккумулятора в шаблон, под именем peopls, не получится именно тот эффект, которого вы и добивались?

Пара мыслей помимо вашего кода:
Какова дальнейшая судьба файлов, которые вы уже обработали, вы будете их читать опять, при следующей итерации? Если файлы будут добавляться достаточно часто, то каждый следующий запрос будет работать дольше предыдущего. Может стоит еще раз подумать?
В зависимости от объема файлов и/или их количества, в особо тяжелых случаях, вы можете упереться в лимит времени ответа. Чинится это легко, но помнить об этом стоит.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы