2016-08-04 81 views
0

我需要在我的app.py中的多個@ app.route中訪問我的WTForm中的信息,以便我可以爲我的應用發佈數據可視化。目前,我有一個@app.route(/home/)頁面,用戶在此頁面輸入的文本由WTForm處理,然後傳遞到@app.route(/results/),我的代碼在其中進行一些數據分析,然後1)顯示一些結果並2)將一些其他信息保存到JSON ,它將用於D3自己的@app.route(/visualization/)。由於Javascript的複雜性,我想在自己的iframe中顯示我的D3可視化。現在我可以加載/home/頁面,輸入文本並點擊「提交」,然後將我重定向到/results/,除iframe之外的所有內容都正確打印。問題是:我無法獲得@app.route(/visualization/)從我的WTForm中獲取信息(與results能夠使用的方式相同),以便圖像可以加載正確的JSON文件。我可以爲多個@ app.route使用一個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)) 

所以我有現在,homeresults與現有WTForm我有做工精細在一起。我會盡一切努力。但在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來識別WTForm中的內容,例如它如何與results一起工作?

此外,這可能看起來很詭異,但我有很好的理由讓我的D3在iframe。這是因爲我需要能夠切換多個html,如/visualization /,每個html都有複雜的Javascript,彼此衝突。我能做的最好的事情是將他們全部隔離在iframe的位置。

回答

0

答案是否定的,您不能將一個表單提交到多個路線或在多個路線之間共享數據。我需要在多個路由之間共享數據的問題的解決方案是創建動態URL。所以,而不是總是去results頁面,它會去results/1234,這樣我就可以訪問「1234」並在該HTML中使用它。

相關問題