Flask - render template uppdaterar inte sidan med ny information
Hej!
När jag klickar på en div-tag så får jag informationen till servern via ajax.
Jag har följande JS-funktion (och här ska jag vara ärlig, jag hade aldrig för avsikt att använda ajax och har ännu inte satt mig in helt i hur det fungerar, men slutprodukten beter sig som jag tänkt):
function getName(name){
var userinfo = document.getElementById(name).innerHTML;
console.log(userinfo);
const dict_values = {userinfo}
const s = JSON.stringify(dict_values)
$.ajax({
url:"/ProcessUserInfo",
type:"POST",
contentType: "application/json",
data: JSON.stringify(s)
});
}
Tänk er messenger eller imessage, man klickar på en kontakt helt enkelt, när man klickar på en kontakt så skickas namnet vidare till "ProcessUserInfo", den här metoden har som enda syfte att redirect till "user" routen (metoden nedanför den här metoden) med informationen som kommit in via användaren (alltså namnet på kontakten man har klickat på).
@app.route('/ProcessUserInfo', methods=['POST', 'GET'])
def ProcessUserInfo():
if request.method == 'POST':
output = request.get_json()
result = json.loads(output)
uinfo = result['userinfo']
session['cp'] = uinfo
print(session['cp'])
return redirect(url_for("user"))
else:
return redirect(url_for("user"))
När man kommer till user-routen, så ser metoden ut på följande vis:
@app.route("/user", methods=["POST", "GET"])
def user():
name=None
try:
name = session.get('cp')
except Exception as error:
print("It went wrong here")
print(error)
if "user" in session:
user = session["user"]
all_mess = db_connector.return_message(user, name)
all_contacts = db_connector.return_contacts(user)
if request.method == "POST":
message = request.form["message"]
db_connector.send_message(user, name, message)
all_mess = db_connector.return_message(user, name)
all_contacts = db_connector.return_contacts(user)
return render_template("startpage.html", posts=all_mess, contacts=all_contacts, user=user)
elif request.method == "GET":
all_mess = db_connector.return_message(user, name)
all_contacts = db_connector.return_contacts(user)
return render_template("startpage.html", posts=all_mess, contacts=all_contacts, user=user)
return render_template("startpage.html", posts=all_mess, contacts=all_contacts, user=user)
else:
return redirect(url_for("login"))
När jag klickar och redirectas via ProcessUserInfo så kommer jag till metoden ovan och i terminalen skrivs det ut:
"GET /user HTTP/1.1" 200 -
Jag har även kollat vad som körs i user-metoden och det är följande:
elif request.method == "GET":
all_mess = db_connector.return_message(user, name)
all_contacts = db_connector.return_contacts(user)
return render_template("startpage.html", posts=all_mess,
Men trots att return render_template körs så uppdateras inte sidan. Vad som dock sker är att när jag visar sidkällan så stämmer inte den koden överens med vad jag ser och när jag sen manuellt refreshar sidan så kommer den "nya" informationen upp.
Vad är det som leder till detta och hur löser jag det?
Tack på förhand!
Kollade lite på hur messenger fungerar och la märke till att det laddas en ny url för varje konversation man klickar på, exempelvis:
Konversation 1: www.messenger.com/t/123456789
Konversation 2: www.messenger.com/t/482828394
osv...
I min kod:
När jag klickar på en kontakt så körs koden under elif request.method=="GET": där det framförallt är parametern name som uppdaterats och som går in i all_mess och hämtar meddelandena mellan user och name, den här datan passas sen in i html-filen startpage.html. Men det som hämtas är ju "samma" html-fil fast med ny data och den ligger under samma route "user" (url uppdateras alltså inte och är samma för alla konversationer). Är det detta som är problemet, att jag inte har en unik route för varje konversation?
Om jag behöver detta måste ju det kunna skapas på ett dynamiskt sätt då man ska kunna starta nya och ta bort gamla konversationer.