webentwicklung-frage-antwort-db.com.de

Flaschen-URL für URLs in Javascript

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>
31
Erik Rothoff

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>
28
Stewart Park

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.

14
dumbmatter

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.

3
Yaniv Aknin

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. 

2
Jacopofar

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()
})
2
Louis T

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>
0
Cole Murray