2016-08-04 3 views
0

複数の@ 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と一緒homeresults作業罰金。私はすべてを適切に行う。しかしresults.htmlに、私はそうのようiframevisualization.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でそれらを隔離することです。

答えて

0

答えはいいえ、複数のルートに1つのフォームを送信したり、複数のルート間でデータを共有することはできません。複数のルート間でデータを共有する必要があるという問題に対する私の解決策は、動的URLを作成することでした。だからいつもresultsページに行くのではなく、それはresults/1234に行き、こうして私は "1234"にアクセスして、そのHTMLでそれを使うことができました。

関連する問題