Wie sende ich Variablen von JavaScript nach Flask via jQuery?

regex9  21.08.2021, 17:40

Welche Zwischenwerte / Rückmeldungen erhältst du?

billythekidd0 
Fragesteller
 21.08.2021, 19:24

console.log(MyJason)=print(Namensliste)= {"name1" : "Jens", "name2" : "Josef", "name3" : "Johannes" }, rofl.html wird aber nicht aufgerufen als neue Seite.

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Den Aufruf einer neuen Seite kannst du nicht erwarten, da der AJAX-Request eine unabhängige HTTP-Anfrage an deinen Server ist (gerade da man oft nicht die komplette Seite neu laden möchte, verwendet man Requests via AJAX/Fetch). Das Ergebnis, welches deine Controller-Methode test zurückgibt, wird in den data-Parameter deiner Callback-Funktion:

success: function(data) {
  console.log(data, "Rückmeldung1");
}

geschleust. Du könntest diese Daten nun mit JavaScript in das DOM einfügen. Du brauchst ein Element, dem du den neuen Inhalt anhängen kannst. Ich würde mir dafür ein eigenes Element anlegen:

<p id="output"></p>

Deine Callback-Funktion:

success: function(data) {
  console.log(data, "Rückmeldung1");
  document.getElementById("output").innerText = data;
}

Des Weiteren sollte nochmal der Controller angepasst werden, da du ja nur die Namensliste ausgeben lassen möchtest:

def test():
  Namensliste = request.get_json(True)
  print(Namensliste)
  return "NamensListe: " + Namensliste

Wenn du aber auf eine neue Seite leiten möchtest, nutze stattdessen nur das Formular:

<form action="/test" method="post">
  <input type="hidden" name="name1" value="Jens">
  <input type="hidden" name="name2" value="Josef">
  <input type="hidden" name="name3" value="Johannes">
  <button>Send UserInfo</button>
</form>

Ich habe die Werte hier in einzelne versteckte Felder gesetzt und du würdest sie im Controller aus dem request.form-Dictionary holen.

Beispiel:

name1 = request.form.get("name1")

Du könntest aber auch alle Werte in ein Feld schreiben (kommasepariert, o.ä.). Noch eine Methodik wäre diese:

<form action="/test" method="post">
  <input type="hidden" name="name[]" value="Jens">
  <input type="hidden" name="name[]" value="Josef">
  <input type="hidden" name="name[]" value="Johannes">
  <button>Send UserInfo</button>
</form>

Im Controller:

names = request.form.getlist("name[]")

In names stände dann eine Liste mit allen Namen.

PS.: Bei all deinen HTML-Dateien fehlt (in der ersten Zeile) seltsamerweise der Doctype.

<!doctype html>

Ergänze ihn noch.

billythekidd0 
Fragesteller
 24.08.2021, 14:47

Danke erstmal für die Antwort. Den Doctype habe ich aus Übersichtlichkeit weggelassen.

Also ganz allgemein will ich einfach JSON-Objekte von Javascript nach Flask senden und diesen in meinen Templates auf einer neuen Route verwenden. Gibt es dafür eine einfache Möglichkeit. Mir erschließt sich nicht ganz der nutzen von

function JSONTest() {

var MyJason= JSON.stringify(myJason);

console.log(MyJason)

$.ajax({

type: 'POST',

url: '/test',

data: MyJason,

success: function(data) {

console.log(data, "Rückmeldung1");

}});

dem Abschnitt, wenn der return aus "/test" in data gespeichert wird. Kann ich nicht irgendwie das JSON-Objekt einfach zu Flask senden und dort dann nach diesem Schema einfach fortfahren?:

return render_template("rofl.html", Namensliste=Namensliste)

0
regex9  24.08.2021, 15:50
@billythekidd0

Wie gesagt: Ein AJAX-Request dient dazu, eine parallele Anfrage an den Server zu senden, damit eben kein Neuladen der Seite notwendig ist. Wenn du das nicht möchtest, verwende kein AJAX und füge deinen Wert einfach nur in irgendein Formularfeld ein. Wenn es notwendig ist, geht das auch via JavaScript.

<form action="/test" method="post" name="someform">
  <input name="jsondata" type="hidden">
  <button>Send</button>
</form>
<script>
  document.forms["someform"].addEventListener("submit", evt => {
    const field = document.querySelector("input[name='jsondata']");
    field.value = "your JSON data ...";
  });
</script>     
0

Ich habe keine Erfahrung in Python bzw. Flask, aber vielleicht hilft dir meine Antwort trotzdem weiter. Du schickst deine Daten als FormData. Das heisst, dass deine Daten, welche du mit JQuery verschickst im Header deiner POST-Request gespeichert sind, nämlich als Key-Value-Pairs.

In deinem Python Code sieht es für mich so aus, als ob du den Body der Anfrage benutzt. Dieser ist aber leer. Du musst also mit Flask irgendwie die Post-Felder auslesen (name1, name2 und name2).

Woher ich das weiß:Berufserfahrung – Informatiker Applikationsentwicklung