2014-02-22 10 views
17

ich auf einem Web-Projekt arbeiten, Python und Kolben verwenden. Ich habe mich nur gefragt, ob ich auf Parameter zugreifen kann, die von Python in meinen externen Javascript-Dateien gesendet werden? Es funktioniert gut mit HTML-Dateien oder mit js in HTML-Dateien eingebettet, aber nicht, wenn Javascript extern ist.Verwenden Jinja2 Template-Engine in externen JavaScript-Datei

Siehe unten.

Der Python-Code

@app.route('/index') 
def index(): 
    return render_template('index.html', firstArg = 2, secondArg = 3) 

Die index.html Code

... 
<body> 
    <p>The first arg is {{firstArg}}.</p> 
    <script src="index.js"></script> 
</body> 
... 

Und die index.js Datei

window.onload=function(){ 
    console.log('{{secondArg}}'); 
}; 

So ist der erste arg in der HTML-Datei korrekt ist, aber das zweite funktioniert nicht in der js-Datei. Der Browser zeigt Unexpected token { an.

Vielleicht ist es nicht möglich, sie in externen js zu benutzen?

Sonst würde ich brauche die secondArg als Eingangsdaten in HTML einfügen und es innerhalb der js-Datei erhalten, aber es ist nicht sehr sauber.

Wenn jemand helfen kann, danke.

Antwort

18

Die index.js wird wahrscheinlich nicht von Ihrer Flask-Instanz bedient, aber sie wird definitiv nicht von Ihrer Vorlage-Engine verarbeitet und selbst wenn sie nicht denselben Kontext hätte wie der HTML-Code, für den sie angefordert wird. nur @yourapp.route('index.js'):

Ich denke, die sauberste Lösung in Ihrem index.js eine Initiierungsfunktion hat und es aus der HTML-Datei nennen würde:

<body> 
    <p>The first arg is {{firstArg}}.</p> 
    <script type="text/javascript" src="index.js"></script> 
    <script type="text/javascript"> 
     yourInitFunction({{secondArg}}); 
    </script> 
</body> 

Man könnte auch sagen, Kolben zu routen, zu dem index.js Wie du es mit der route('/index') getan hast, ist das wahrscheinlich keine sehr gute Idee.

+0

Danke. Ich werde Ihre Lösung mit dem Aufruf der Funktion aus dem HTML übernehmen. Ich habe nur eine Frage, was wäre der Effekt von Routing index.js? Ich verstehe nicht, was du meinst, ich dachte, es wäre nur für Routen und ich kann den Link mit der js-Datei nicht sehen. –

+0

Wenn Sie eine Route hinzufügen, wird flask die GET-Requests für den Parameter der Route behandeln, indem Sie die dekorierte Funktion aufrufen (dh die Funktion nach der 'app.route()'). So können Sie alle Anfragen an 'index.js' abfangen, Berechnungen durchführen und die Template-Engine die JavaScript-Datei wie Ihre HTML-Dateien rendern lassen. PS: Wenn Sie meine Antwort hilfreich finden, würde ich mich freuen Sie akzeptieren. –