2017-12-28 4 views
0

Ich habe eine Seite mit einer Schaltfläche, die eine ajaxpost zu einer flask Route macht. Ich möchte, dass die Route eine Nachricht berechnet (vereinfacht durch Hardcoding für das Beispiel) und sie an eine andere Route zurückgibt und die Seite, auf der sich der Benutzer befindet, neu lädt. redirect(urlfor()) ruft die andere Route auf, aber render_template scheint nicht aufgerufen zu werden, da die Seite nicht neu geladen wird.Flask redirect (urforor()) lädt die Seite nicht

init Py

from flask import Flask, render_template, request, redirect, url_for 

app = Flask(__name__) 


@app.route('/second_route', methods=['POST']) 
def second_route(): 
    print request.json 
    return redirect(url_for('hello_world', message='test')) 


@app.route('/') 
def hello_world(message=None): 
    return render_template('index.html', message=message) 


app.run() 

index.html

<html> 
<head> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 


    <script> 
     $(document).ready(function() { 
      $('#mybutton').click(function() { 
       $.ajax({ 
        type: "POST", 
        contentType: "application/json; charset=utf-8", 
        url: "/second_route", 
        data: JSON.stringify({}), 
        success: [], 
        dataType: "json" 
       }); 

      }); 
     }); 


    </script> 
</head> 
<body> 
{{ message }} 
<button id="mybutton" name="mybutton" type="button">Click Me!</button> 
</body> 
</html> 

Antwort

1

AJAX eine Umleitungsantwort nicht verarbeiten kann, afaik. Sie könnten jedoch {{message}} in einem <span id="message"> einkapseln, das Element identifizieren und eine jQuery .html() ausführen, um benutzerdefinierten Text nach erfolgreichem AJAX-Abschluss einzufügen.

$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    url: "/second_route", 
    data: JSON.stringify({}), 
    success: [], 
    dataType: "json" 
}).done(function(){ 
    $('#message').html('test'); 
    window.location.href = '/'; 
}).fail(function(response){ 
    $('#message').html(response['responseText']); 
}); 

So leiten Sie den Code innerhalb der mit window.location.href = "/someURL"done Klausel ersetzen würden, aber da der Endpunkt das gleiche ist, ist dies nicht notwendig. Auf diese Weise wäre die Verwendung einer message Variablen überhaupt nicht notwendig.

+0

so war dies ein vereinfachtes Beispiel. 'second_route' wird verwendet, um Daten in eine Datenbank zu übertragen. 'message' wird verwendet, um den Erfolg dieser Daten zurückzugeben, und das erneute Laden der Seite erfordert eine Menge Daten aus der Datenbank, so dass die" done "-Funktion mit dem div-Tag (in diesem Beispiel funktioniert nicht) in meiner Anwendung funktioniert. Wenn ich 'window.location.href' verwendet hätte, hätte ich keinen Zugriff auf die Nachricht. Tut mir leid, mein einfaches Beispiel vereinfacht die Dinge. – user2242044

+0

nur um zu klären, fragen Sie die Datenbank beim ersten Laden von 'index.html' ab? Ich denke, beides zu integrieren war das, was du brauchst. Enthaltene Klausel für den Fall, dass ein AJAX-Aufruf in einen Fehler geriet. – Mangohero1

+0

Ich bin mir nicht sicher, ob ich die Nachricht in 'done' speichern und dann die '/' route neu laden kann, weil das die Nachricht überschreibt. – user2242044

1

Dies ist, wie ich das Problem für diejenigen gelöst habe, die die Frage lesen.

Ändern meiner Post-Anforderung der Lasten die Seite mit diesem Aufruf an dem gleichen Weg zu schreiben:

var posting = $.post(window.location.href, {'some key': 'some value'}); 
       posting.done(function() { 
        window.location.replace(window.location.href); 
       }); 
+0

Ah, so ist es gemacht. Die 'window.location.replace()' war neu für mich. Schätze, wir haben beide etwas gelernt! UV'd – Mangohero1