複数の@ app.routeの私のapp.py
に私のWTFormの情報にアクセスする必要があるので、私は自分のアプリケーションのデータの可視化を投稿することができます。現在、@app.route(/home/)
ページがあり、このページのユーザー入力テキストはWTFormで処理された後、@app.route(/results/
に渡されます。ここでコードはデータ分析を行い、1)結果が表示され、2)その他の情報がJSONに保存されますこれはD3のためにそれ自身の@app.route(/visualization/)
で使用されることになっています。 Javascriptの複雑さのために、自分のD3ビジュアライゼーションをiframe
で表示したいと思います。今すぐ/home/
ページを読み込み、テキストを入力して「Submit」を押すと/results/
にリダイレクトされ、iframe
以外のすべてが正しく印刷されます。問題は:results
と同じ方法で、私のWTFormから情報を取得するために@app.route(/visualization/)
を取得することができないため、イメージが適切なJSONファイルをロードできるようになります。複数の@ app.routeに1つのWTFormを使用できますか?
ここでは、問題をより詳しく説明するためのコードをいくつか示します。
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))
だから私は今それを持っているように、私が持っている既存のWTFormと一緒home
とresults
作業罰金。私はすべてを適切に行う。しかしresults.html
に、私はそうのようiframe
でvisualization.html
をロードする必要があります: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
に、
results
と同じようにWTFormのコンテンツを認識させることができますか?
また、これはハッキーに思われるかもしれませんが、iframe
に私のD3を置く理由は非常にあります。それは私が/visualization
のような複数のhtmlを切り替えることができる必要があるからです。それぞれには、互いに衝突する複雑なJavascriptがあります。私ができる最善のことは、すべてiframe
でそれらを隔離することです。