2016-08-09 51 views
1

Meine App verfügt über ein Textfeld und eine Übermittlungsschaltfläche. Ich versuche, dynamische URLs in meiner App zu erstellen und umzuleiten, die auf dem basieren, was in das Textfeld eingegeben wurde. Beispiel: Der Nutzer gibt "1234" ein, klickt auf "Senden" und wird dann zu "website.com/results/1234" weitergeleitet. Das Problem scheint zu sein, dass der HTML-Code für meine Schaltfläche den Benutzer nicht auf die neue dynamische URL umleiten soll. Ich gebe das an den HTML mit Jinja weiter.Probleme bei der Umleitung zu dynamischen URLs in Flask mit 'Aktion'

Hier ist was ich habe.

Der Benutzer startet auf der Homepage, dass definiert wird, wie dies

@app.route("/home/", methods=["GET", "POST"]) 
def start(): 
    return render_template("dashboard.html") 

Dashboard.html ein Textfeld und Vorlage Taste hat (siehe unten). Wie Sie sehen können, ist die action dieser Schaltfläche auf {{ results_page }} umleiten, wo "Ergebnisse_Seite" von meiner Python-Funktion load_results kommt (auch unten) und an den HTML-Code mit render_template übergeben wird.

Die Ergebnisseite meiner App verwendet die Benutzereingabe, um einige Informationen nachzuschlagen und anzuzeigen.

@app.route('/results/<query>', methods=["GET", "POST"]) 
def load_results(query): 
    form = pmidForm(secret_key='super secret key') 
    try: 
     if request.method == 'POST': 
      query = form.pmid.data #This is the user input 

      results_page = "website.com/results/"+query 
      return(query) 

      #do lots of stuff using the query 

     return render_template('results.html', form=form, results_page = results_page) 


    except Exception as e: 
     return(str(e)) 

Wenn ich meine App wie diese laufen, ist die Homepage in Ordnung, aber wenn ich auf „Senden“, wird die App nicht in der Benutzereingabe übernehmen oder mit ihm nichts tun. Einfach die home Seite aktualisiert.

Ich bin neu in Web-Entwicklung, aber da dieser Code funktioniert gut, wenn ich die Taste, um action = "website.com/results" im HTML codieren, und tun, ohne die <query> in /results/<query> für die Ergebnisseite, glaube ich, dass nur wenige Anpassungen erforderlich werden sollte, um meine App dynamisch auf Seiten umzuleiten und sie korrekt zu laden. Im Moment bin ich mir nicht sicher, was ich vermisse. Bitte lassen Sie mich wissen, wohin ich gehe.

EDIT -

Jetzt habe ich implementiert eine handle_form Funktion, die meine dynamische URL umleitet. Diese Funktion leitet richtig um, aber dann erhalte ich einen 404 Fehler.

@app.route('/form/', methods=["POST"]) #handles form submission 
def handle_form(): 
    form = pmidForm(secret_key='super secret key') 
    if request.method == "POST": 
     query = request.form['pmid'] 
    return redirect('/results/'+query) 

Ich habe auch action meine Form in der HTML bearbeitet gehen zu /form/

<form action="website.com/form/" class="form-inline" method="post"> 
    <div class="form-group"> 
    <label for="PubmedID">Pubmed ID(s)</label> 
    <input type="text" class="form-control" id="PubmedID" placeholder="18952863, 18269575" name="pmid" value="{{request.form.pmid}}"> 
    </div> 
    <button type="submit" id= "myButton" class="btn btn-default" data-toggle="modal" data-target="#myModal">Submit</button> 
</form> 

Damit wird meine Seite richtig /results/<query>/(zB/Ergebnisse/1234) umleiten, aber ich bekomme ein 404 Fehler. Hier ist, wie ich mich verändert habe meine load_results

@app.route('/results/<query>', methods=["GET"]) 
def load_results(query): 
    form = pmidForm(secret_key='super secret key') 
    try: 
     if request.method == 'GET': 
      query = form.pmid.data #THIS IS THE USER INPUT FROM THE FORM #referencing 'class pmidForm' 
      return query 

      . 
      . 
      #do stuff 

Ich glaube, ich bin ganz in der Nähe, aber brauche, um herauszufinden, warum ich eine 404-Störung erhalten. Meine Vermutung ist, dass ich "GET" falsch verwende. Mein Formular im HTML verwendet method="post". Da dies nicht mit "GET" übereinstimmt, gibt es keine Möglichkeit für meine load_results(query) Funktion, den Inhalt des Formulars abzurufen?

EDIT 2 -

handle_form Changed mit url_for umleiten:

@app.route('/form/', methods=["POST"]) #handles form submission 
def handle_form(): 
    form = pmidForm(secret_key='super secret key') 
    if request.method == "POST": 
     query = request.form['pmid'] 
    return redirect(url_for('.load_results', query=query)) 

Und geändert load_results nicht zurückkehren "query"

@app.route('/results/<query>', methods=["GET"]) 
def load_results(query): 
    form = pmidForm(secret_key='super secret key') 
    try: 
     if request.method == 'GET': 
      query = form.pmid.data # This shouldn't work?? 
      . 
      . 
      # do stuff with the variable "query"   

Damit es nach wie vor ist die Rückkehr der 404 Fehler wie vorher. Sollte ich nicht if request.method == GET verwenden?

bearbeiten 3 -

Selbst eine sehr vereinfachte load_results gibt mir die 404-Fehler, also bin ich nicht sicher, was los ist.

@app.route('/results/<query>', methods=["GET", "POST"]) 
def load_results(query): 
    q = query 
    return render_template('test.html', q=q) 

EDIT - 3

Es scheint, dass die akzeptierte Lösung die richtige Lösung für dieses Problem ist, aber es gibt ein Problem mit uwsgi in meinem Server, wird es an der falschen Stelle wieder lenk :(

Antwort

1

Ihr pünktliches Problem ist, dass/home Routenfunktion muss auch auf dem Templat-Kontext die results_page url setzen.

results_page = "website.com/results" 
return render_template("dashboard.html", results_page=results_page) 

Da die Variable undefine ist d, flask ruft den ursprünglichen Endpunkt bei der Formularübergabe an.

Ihr größeres Problem ist, dass Ihre appraoch nicht erhalten Sie eine dynamische Ergebnisse URL, die aussieht/Ergebnisse/1234.

Typische Ansätze sind die Umleitung auf der Server-Seite, wenn Sie die Post-Anfrage bearbeiten; oder JavaScript im Client verwenden, um die Formulardaten abzurufen und den Browserpfad in/results/1234 zu ändern.

Eine vereinfachte Version, wie mit einer serverseitigen Umleitung umzugehen, könnte in etwa so aussehen. Eine Route, die die Formularübermittlung behandelt, und eine, die Ergebnisse anzeigt. Sie leiten einfach von einem zum anderen um, um die nette URL zu erhalten.

@app.route('/form', methods=["POST"]) 
def handle_form(): 
    query = form.pmid.data #This is the user input 
    return redirect(url_for('.load_results', query=query)) 

@app.route('/results/<query>') *removed the method spec to handle the redirect? 
def load_results(query): 
    . 
    . 
    # do something with query 
+0

Ich werde das versuchen und auf Sie zurückkommen. Danke für deine Antwort! Ich verstehe, warum es jetzt nicht umleitet. Ich verstehe nicht genau, wie man "umleitet, wenn man den Post bearbeitet". Ist es nicht, dass ich es jetzt mache? Ich zeige die Form nicht wirklich wieder, und ich brauche schließlich etwas wie/results/1234, also muss ich herausfinden, wie das geht. Ich habe hier einen vereinfachten Code veröffentlicht, um mein Problem zu illustrieren. Mein Code erstellt tatsächlich Datenvisualisierungen :) Vielleicht ist JavaScript hier die beste Option? Was denken Sie? Danke noch einmal! – SnarkShark

+0

Ich habe einen Beispielcode hinzugefügt. –

+0

Danke für diesen Beispielcode! Ich denke, ich bin nah dran, aber nicht ganz da. Ich werde meinen Beitrag bearbeiten, um zu zeigen, was ich jetzt habe. Die 'handle_form' Funktion funktioniert gut umleiten, aber dann bekomme ich eine 404" Nicht gefunden Die angeforderte URL/Ergebnisse/1234 wurde nicht auf diesem Server gefunden. " Es ist seltsam, dass ich den Standard 404 und nicht den benutzerdefinierten 404 Fehler, den ich gemacht habe, bekomme. Ich vermute, dass ich "GET" falsch verwende? – SnarkShark