2015-03-29 12 views
6

Ho bisogno di avere accesso al modello jinja in file javascript (a causa di tag i18n). Quindi il modo in cui ho trovato è caricare il file js con include, dal metodo jinja. {% include "file.js" %}Importare file javascript con jinja dalla cartella statica

Tuttavia, questo metodo cercherà i file solo nella cartella dei modelli. Ma i file js devono essere nella cartella statica. La mia domanda è, come posso cambiare il modo in cui jinja cerca i file? Invece di cercare nella cartella dei modelli, in questo caso, cerca nella cartella statica.

{% block javascript %} 
    <script type="text/javascript"> 
     {% include "myscript.js" %} 
    </script> 
{% endblock %} 
+0

è possibile usare [ 'url_for (' static ', filename =' script.js ') '] (http://flask.pocoo.org/docs/0.10/quickstart/#static-files) se posizioni i file in ** static ** dir – kartheek

+2

@kartheek non è utile in questo caso, questo utente vuole trattare il file come un modello – davidism

risposta

4

Se è necessario trattare un file come modello, non è statico. Mettilo nella cartella dei modelli e rendilo. Se il file è non dinamico, allora è statico. Mettilo nella cartella statica e collegalo ad esso. Non è necessario che un determinato tipo di file sia un modello o un file statico. Scegli quello che è necessario.

D'altra parte, è probabilmente meglio mantenere JS statico e passare argomenti ad esso, piuttosto che generare codice diverso in base a input diversi.

+0

Hmm, sembra ragionevole. Semplicemente non mi sembra pulito, di avere un file javascript (dinamico, modello modificato) all'interno della cartella "modello" - ma probabilmente è la strada da percorrere. – lakerz

+0

Sebbene sia una vista eccellente per circostanze normali, ci sono dei momenti in cui è necessario includere JS (ad esempio, il rendering di una pagina 500). –

5

Data una struttura di directory di esempio che assomiglia a questo

app/static/css/bootstrap.min.css 
app/static/js/bootstrap.min.js 
app/templates/test_page.html 
app/views 
run_server 

È possibile impostare il pallone static_url_path quando si crea l'oggetto applicazione

app = Flask(__name__, static_url_path='/static') 

e poi in test_page.html si può avere qualcosa che assomiglia questo

<link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet"> 

I'm an html body 

<script src="{{ url_for('static', filename='js/bootstrap.min.js') }}"></script> 
+0

Non è necessario impostare il percorso dell'URL statico nell'esempio, questo è il valore predefinito. Inoltre, questo non risponde alla domanda, in quanto volevano sapere come trattare il file javascript come modello. – davidism

+0

Grazie per il feedback. Volevo essere esplicito sul percorso in questo caso perché è una caratteristica che non conoscevo da molto tempo. Inoltre, sono d'accordo sul fatto che stanno chiedendo di trattare il file javascript come modello, ma ho dato una risposta che pensavo potesse risolvere il loro problema di fondo, nonostante il modo in cui lo chiedevano. = P – AlexLordThorsen

1

È possibile creare mangiato e registra una funzione globale che solo facendo:

import os 

app = Flask(__name__.split('.')[0]) 

@app.template_global() 
def static_include(filename): 
    fullpath = os.path.join(app.static_folder, filename) 
    with open(fullpath, 'r') as f: 
     return f.read() 

E poi è possibile includere in questo modo (il -filter safe impedisce citazioni iniziano sfuggito):

{% block javascript %} 
    <script type="text/javascript"> 
     {{ static_include("myscript.js") | safe }} 
    </script> 
{% endblock %} 
Problemi correlati