Мне нужно получить доступ к информации из моего WTForm в нескольких приложениях @ app.route в моем app.py
, чтобы я мог публиковать визуализацию данных для своего приложения. В настоящее время у меня есть страница @app.route(/home/)
, и введенный пользователем текст на этой странице обрабатывается WTForm, а затем передан в @app.route(/results/
), где мой код выполняет некоторый анализ данных, а затем 1) отображает некоторые результаты и 2) сохраняет некоторую другую информацию в JSON , который должен использоваться для D3 в своем собственном @app.route(/visualization/)
. Из-за осложнений с Javascript я хочу показать свою визуализацию D3 в своем iframe
. Прямо сейчас я могу загрузить страницу /home/
, набрать текст и нажать «Отправить», после чего перенаправляет меня на /results/
и правильно печатает, кроме iframe
. Проблема в том, что я не могу получить @app.route(/visualization/)
, чтобы получать информацию из моего WTForm (точно так же, как это возможно results
), чтобы изображение могло загрузить соответствующий файл JSON.Могу ли я использовать один WTForm для нескольких приложений @ app.route?
Вот некоторые из моих кодов, чтобы лучше проиллюстрировать проблему.
app.py
:
# Home
@app.route("/home/", methods=["GET", "POST"])
def gohome():
error = None
with open('somedata.pickle', 'rb')as f:
some_content = pickle.load(f)
try:
if request.method == "POST":
attempted_pmid = request.form['pmid']
except Exception as e:
#flash(e)
return render_template("dashboard.html", error=error)
return render_template("dashboard.html", some_content=some_content)
# My WTForm for handling user-entered pmids
class pmidForm(Form):
pmid = TextField('PubmedID')
# Results
@app.route("/results/", methods=["GET", "POST"])
def trying():
form = pmidForm(secret_key='potato')
try:
if request.method == 'POST':
entry = form.pmid.data #THIS IS THE USER INPUT FROM THE FORM #referencing 'class pmidForm'
pmid_list = multiple_pmid_input(entry) #list for handling multiple pmids
print(pmid_list)
for user_input in pmid_list:
print(str(user_input))
user_input = str(user_input)
# DO STUFF HERE #
# SAVE A JSON FILE TO A FOLDER #
return render_template('results.html')
except Exception as e:
return(str(e))
# Visualization
@app.route('/visualization/', methods=["GET", "POST"]) #for iframe
def visualization():
#need to get last user_input
form = pmidForm(secret_key='potato')
try:
if request.method == 'POST':
entry = form.pmid.data
pmid_list = multiple_pmid_input(entry)
for user_input in pmid_list:
print("This is the user input on /visualization/")
print(str(user_input))
user_input = str(user_input)
#Load
if user_input == pmid_list[-1]:
load_path = '/the/path/'+str(user_input)+'/'
completeName = os.path.join(load_path, ((str(user_input))+'.json'))
print(completeName)
with open(completeName, 'w') as load_data:
jsonDict = json.load(load_data)
print(jsonDict)
return render_template('visualization.html', jsonDict=jsonDict)
except Exception as e:
return(str(e))
Так как у меня сейчас, home
и results
прекрасно работают вместе с существующими WTForm у меня есть. Я сделаю все правильно. Но в results.html
нужно загрузить visualization.html
в iframe
как так:
линии в results.html
:
<iframe id="vis1" src="https://www.website.com/visualization/" width="1000" height="1000"></iframe>
При такой конфигурации, если я запускаю app.py
, все, дисплеи, как нормальный, за исключением iframe
, который отображает:
местная переменная 'jsonDict', указанная перед присвоением
Здесь, я полагаю, что это по отношению к моей visualization.html
, который имеет код дзиндзя:
var myjson = {{ jsonDict|tojson }};
Так, очевидно, @app.route(/visualization/)
не получает информацию от WTForm, как это должно быть. Как я могу получить эту вторую @app.route
, чтобы распознать содержимое в WTForm, как это работает с results
?
Кроме того, это может показаться взломанным, но у меня есть очень веские причины для установки моего D3 в iframe
. Это потому, что мне нужно иметь возможность переключаться через несколько html, например /visualization
/, каждый из которых имеет сложный Javascript, который конфликтует друг с другом. Лучшее, что я могу сделать, это изолировать их всех в iframe
.