Я пишу сценарий, чтобы проверить, существует ли файл json. Если это так, то он использует функцию flask render_template, чтобы использовать данные для загрузки веб-страницы. В противном случае сценарий запрашивает базу данных, помещает данные в формате json, а затем создает и записывает в файл json. Вот пример кода.
from flask import render_template
import json
import os
title = "Tests"
jsonFile = "tests.json"
if os.path.exists(jsonFile):
return render_template('tests.html', title=title, data='tests')
else:
data = '{"tests":[{"id":"1","ip_addy":"IP1","name":"name1"},
{"id":"2","ip_addy":"IP2","name":"name2"},
{"id":"3","ip_addy":"IP3","name":"name3"}
]}'
with open(jsonFile, "w+") as f:
json.dump(data, f)
f.close()
return render_template('tests.html', title=title, data=data)
Он отлично записывает в файл test.json, но когда я перезагружаю страницу tests.html после создания test.json, html сообщает, что нет записей для отображения. Я неправильно создал файл json?
Спасибо, Саймон. На самом деле у меня был f.close (), а не close (f). Файл json не пустой.
Затем, если он существует, вы визуализируете шаблон в операторе if. и data = 'test' в вашем шаблоне. Если вы хотите прочитать рендеринг с данными в файле, вы должны попытаться прочитать содержимое файла перед рендерингом, передав его с помощью первого оператора.






Как упоминает @Simon Johansson, похоже, проблема в том, что вы не читаете содержимое файла. Мне кажется, что именно это изменение работает.
@app.route('/test')
def test():
title = "Tests"
jsonFile = "tests.json"
if os.path.exists(jsonFile):
file_data = ""
try:
with open(jsonFile) as f:
file_data = f.read()
except:
file_data = "could not read file"
return render_template('tests.html', title=title, data=file_data)
else:
data = {"tests":[{"id":"1","ip_addy":"IP1","name":"name1"},
{"id":"2","ip_addy":"IP2","name":"name2"},
{"id":"3","ip_addy":"IP3","name":"name3"}
]}
with open(jsonFile, "w+") as f:
json.dump(data, f)
f.close()
return render_template('tests.html', title=title, data=data)
Я попытался изменить данные файла после записи, и измененные данные отображаются правильно, указывая, что данные считываются из файла нормально, если он есть.
Я использовал простые шаблоны \ tests.html
<html><head><title>{{title}}</title></head>
<body>Data:<br>{{data}}</body>
</html>
Спасибо. Я сделал это вместе с заменой file_data = f.read на file_data = json.load (f). Тогда он работал правильно.
Это решение проблемы, спасибо Саймону и Дж. Фэй. Данные должны быть записаны и прочитаны как json.
@app.route('/test')
def test():
title = "Tests"
jsonFile = "tests.json"
if os.path.exists(jsonFile):
file_data = ""
try:
with open(jsonFile) as f:
file_data = json.load(f)
f.close()
except:
file_data = "could not read file"
return render_template('tests.html', title=title, data=file_data)
else:
data = {"tests":[{"id":"1","ip_addy":"IP1","name":"name1"},
{"id":"2","ip_addy":"IP2","name":"name2"},
{"id":"3","ip_addy":"IP3","name":"name3"}
]}
with open(jsonFile, "w+") as f:
json.dump(data, f)
f.close()
return render_template('tests.html', title=title, data=data)
близко (ж) нормально? Для меня python жалуется, но может быть, в python 3.6 close (f) превратился в f.close (). Также в вашем случае, если jsonFile существует в начале скрипта, но пуст, он будет отображаться с данными как «тест».