Angehängt
Ich hatte die Notwendigkeit (habe ich dann letzen Endes anders/sauberer gelöst) in Flask an eine URL Parameter anzuhängen.
Szenario
Das Szenario war:
-
Link löst Get-Request aus, mit Parameter refer_to="https://whatever.com"
-
Route verarbeitet Get-Request und bettet refer_to als Form-Feld ein
-
Form wird abgesendet und generiert Post-Request mit Form-Feldern refer_to="https://whatever.com" und customer_id=5748
-
Route verarbeitet Post-Request und sendet redirect auf "https://whatever.com?customer_id=5748"
Ziel war also im letzten Schritt die URL und die custome_id zu verheiraten.
Normalerweise würde man url_for(Funktionsname, parameter) aufrufen und das würde dann für die Funktion Funktionsname die URL ermitteln und ggf. (wenn es in der Route keine Platzhalter für die Parameter gibt) die Parameter hinten anhängen.
In diesem Fall hatte ich aber schon eine URL, nicht den Namen einer Funktion/Methode.
Lösung
Tatsächlich war es tatsächlich weniger trivial als gedacht, weder Flask, noch Werkzeug boten irgendeine Möglichkeit das zu machen, urllib aus der Standardbibliothek konnte es theoretisch umständlich über das zerlegen der URL in ihre Teile und dann neu zusammenbauen…
Und natürlich könnte man es auch über String-cocanation machen, aber das ist auch nicht sauber und kann Probleme geben mit der Kodierung.
Letzten Endes habe ich eine Lösung bei Stackoverflow gefunden https://stackoverflow.com/questions/2506379/add-params-to-given-url-in-python:
1
2
3
4
5
6
7
from requests import PreparedRequest
raw_url="https://whatever.com"
customer_id = "5748"
fakerequest = PreparedRequest()
fakerequest.prepare_url(raw_redirect_url, {"customer_id": customer_id})
redirect_url = fakerequest.url
-
Zeile 4 erstellt pro forma einen PreparedRequest → einen Request den man zusammenbaut, aber erst später absenden kann
-
Zeile 5 baut die URL zusammen, aus der URL die wir schon haben + dem Parameter den wir anhängen wollen. Die Parameter werden als Dictionary als 2 Parameter von prepare_url übergeben
-
Zeile 6 holt sich die URL die der PreparedRequest nutzen würde aus dem Objekt → das ist die zusammengesetzte URL
Und schon hat man die URL wie man sie haben will.