簡體   English   中英

我可以將一個WTForm用於多個@ app.route嗎?

[英]Can I use one WTForm for multiple @app.route's?

我需要從我的WTForm訪問信息在多個@ app.route在我的app.py ,這樣我就可以發布數據可視化我的應用程序。 當前,我有一個@app.route(/home/)頁面,該頁面上的用戶輸入文本由WTForm處理,然后傳遞給@app.route(/results/ ),我的代碼在其中進行一些數據分析並然后1)顯示一些結果,2)將一些其他信息保存到JSON,該信息將在D3的@app.route(/visualization/)用於D3。 由於Javascript的復雜性,我想在自己的iframe中顯示D3可視化。 現在,我可以加載/home/頁面,鍵入文本並單擊“提交”,然后將我重定向到/results/ ,並正確打印除iframe之外的所有內容。 問題是:我無法獲取@app.route(/visualization/)從WTForm中獲取信息(以results能夠使用的相同方式),以便圖像可以加載正確的JSON文件。

這是我的一些代碼,可以更好地說明問題。

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”

在這里,我假設引用的是我的Jinjin代碼的visualization.html

var myjson = {{ jsonDict|tojson }};

因此,很明顯, @app.route(/visualization/)並沒有從WTForm中獲取信息。 我如何才能獲得第二個@app.route來識別@app.route中的內容,如其如何與results

另外,這似乎有些駭人聽聞,但我有充分的理由將D3放在iframe 這是因為我需要能夠切換多個類似/visualization /的html,而每個html都有彼此沖突的復雜Javascript。 我能做的最好的事情就是將它們全部隔離在iframe

答案是否定的,您不能將一種表單提交到多條路線或在多條路線之間共享數據。 對於需要在多個路由之間共享數據的問題,我的解決方法是創建動態URL。 因此,與其始終訪問results頁面,不如轉到results/1234 ,這樣我就可以訪問“ 1234”並在該html中使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM