2016-08-04 24 views
0

Ich muss auf Informationen von meinem WTForm in mehreren @ app.routes in meinem app.py zugreifen, damit ich Datenvisualisierung für meine App veröffentlichen kann. Derzeit habe ich eine @app.route(/home/) Seite und Benutzer eingegebenen Text auf dieser Seite wird von einem WTForm verarbeitet, und dann an @app.route(/results/ übergeben, wo mein Code einige Datenanalyse und dann 1) zeigt einige Ergebnisse und 2) speichert einige andere Informationen zu JSON , die für D3 in eigener @app.route(/visualization/) verwendet werden soll. Wegen Komplikationen mit Javascript möchte ich meine D3-Visualisierung in einem eigenen iframe anzeigen lassen. Im Moment kann ich die Seite /home/ laden, Text eingeben und "Senden" drücken, was mich dann zu /results/ umleitet und alles korrekt druckt, außer iframe. Das Problem ist: Ich bin nicht in der Lage, @app.route(/visualization/) Informationen von meinem WTForm (wie results ist in der Lage) zu nehmen, so dass das Bild die richtige JSON-Datei laden kann.Kann ich ein WTForm für mehrere @ app.routes verwenden?

Hier ist etwas von meinem Code, um das Problem besser zu veranschaulichen.

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)) 

So, wie ich es jetzt haben, home und results funktionieren zusammen mit dem bestehenden WTForm ich habe. Ich werde alles richtig machen. Aber in results.html muß ich visualization.html in einem iframe wie so laden:

Linie in results.html:

<iframe id="vis1" src="https://www.website.com/visualization/" width="1000" height="1000"></iframe> 

Mit dieser Konfiguration, wenn ich mein app.py laufen, alles zeigt, wie normal, außer den iframe, die zeigt:

lokale Variable 'jsonDict' vor der Zuweisung referenziert

Hier

, gehe ich davon aus, dass auf meine visualization.html in Bezug ist, die den Jinja Code hat:

var myjson = {{ jsonDict|tojson }}; 

So offensichtlich die @app.route(/visualization/) nicht die Informationen aus dem WTForm bekommen, wie es sollte. Wie kann ich diesen zweiten @app.route bekommen, um den Inhalt im WTForm zu erkennen, wie es mit results funktioniert?

Auch das mag hacky scheinen, aber ich habe sehr gute Gründe dafür, meine D3 in eine iframe zu setzen. Es ist, weil ich in der Lage sein muss, durch mehrere htmls wie /visualization/zu springen, die jedes komplizierte Javascript haben, die miteinander in Konflikt stehen. Das Beste, was ich tun kann, ist sie alle in iframe zu isolieren.

Antwort

0

Die Antwort ist nein, Sie können ein Formular nicht an mehrere Routen senden oder Daten zwischen mehreren Routen teilen. Meine Lösung für das Problem, Daten zwischen mehreren Routen teilen zu müssen, bestand darin, dynamische URLs zu erstellen. Anstatt also immer auf eine results Seite zu gehen, würde es zu results/1234 gehen und auf diese Weise konnte ich auf die "1234" zugreifen und sie in diesem HTML verwenden.