Was ist die empfohlene Methode zum Erstellen dynamischer URLs in Javascript-Dateien, wenn Sie eine Flasche verwenden? In den jinja2-Templates und in den Python-Views wird url_for
verwendet. Wie wird dies in .js
-Dateien empfohlen? Da sie nicht von der Template Engine interpretiert werden.
Was im Grunde tun will, ist:
// in comments.js
$.post(url_for('comment.comment_reply'));
Was nicht möglich ist.
Aber ich kann das natürlich in einer Vorlage ausführen:
<script>
$.post(url_for('comment.comment_reply'));
</script>
Was @ dumbmatter vorschlägt, wird so ziemlich als Standard betrachtet. Aber ich dachte, es gäbe einen schöneren Weg. So gelang es mir, dieses Plugin zu entwickeln: Flask-JSGlue .
Nach dem Hinzufügen von {{ JSGlue.include() }}
können Sie Folgendes in Ihrem Quellcode ausführen:
<script>
$.post(Flask.url_for('comment.comment_reply', {article_id: 3}));
</script>
oder:
<script>
location.href = Flask.url_for('index', {});
</script>
Die Flask-Dokumentation schlägt vor, in Ihrer HTML-Datei mit url_for
eine Variable festzulegen, die die Stamm-URL enthält, auf die Sie an anderer Stelle zugreifen können. Dann müssten Sie die Ansichts-URLs manuell erstellen, obwohl Sie sie vermutlich ähnlich wie die Stamm-URL speichern könnten.
Die Antwort von @ jeremy ist korrekt und wahrscheinlich die gebräuchlichere Herangehensweise. Als alternative Antwort sollte dantezhu
eine flask-Erweiterung geschrieben und veröffentlicht haben die behauptet, die in der Kommentar.
Ich benutze diesen schmutzigen und hässlichen Trick:
"{{url_for('mypage', name=metadata.name,scale=93,group=2)}}"
.replace('93/group',scale+'/group')
dabei ist scale
die Javascript-Variable, die ich für eine AJAX -Anforderung verwenden möchte . Url_for eine URL generieren und JavaScript ersetzen den Parameter zur Laufzeit. Der generierte Code sieht so aus:
"/ajaxservive/mynam/scale/93/group/2".replace('93/group',scale+'/group')
was ziemlich seltsam ist, aber keine eleganteren Lösungen finden kann.
Tatsächlich führt mit Blick auf den Code der verknüpften Flaschenerweiterung dasselbe aus, erledigt aber den allgemeinen Fall.
Wurde nach einer Lösung gesucht, kommen sie mit dieser Lösung woher
Kein Add-On erforderlich
Keine hartcodierende URL
Der Schlüssel ist zu erkennen, dass Jinja2
die Fähigkeit hat, Javascript aus der Box zu rendern.
Richten Sie Ihren Vorlagenordner wie folgt ein:
/template
/html
/index.html
/js
/index.js
In deinen Ansichten
@app.route("/index_js")
def index_js():
render_template("/js/index.js")
Statt das Javascript aus Ihrem statischen Ordner zu liefern. Sie würden verwenden:
<script src="{{ url_for('index_js') }}"></script>
Immerhin generieren Sie das Javascript im laufenden Betrieb, es handelt sich nicht mehr um eine statische Datei.
Verwenden Sie nun in Ihrer Javascript-Datei einfach den url_for
wie in jeder html
-Datei.
Verwenden Sie beispielsweise Jquery
, um eine Ajax-Anfrage zu erstellen
$.ajax({
url: {{ url_for('endpoint_to_resource') }},
method: "GET",
success: call_back()
})
In meinem Fall habe ich versucht, URLs dynamisch zu erstellen
Ich habe mein Problem wie folgt gelöst (Hinweis: Ich habe Angulars Syntax auf {[x]} ausgetauscht:
<ul>
<li ng-repeat="x in projects">
{[x.title]}
{% set url = url_for('static',filename="img/") %}
<img src="{{url}}{[x.img]}">
</li>
</ul>