2012-03-19 14 views
16

Sto provando a inserire il file in una pagina utilizzando Jinja 2.6 utilizzando il tag include. Questo ha funzionato bene fino a quando ho iniziato a usare caratteri nel file che ricordano la sintassi Jinja, a quel punto si rese conto che non poteva analizzarli e bombardarli.Inserire i file statici letteralmente nei modelli Jinja senza analizzarli

A corto di andare se il file e sfuggire tutti i personaggi, cosa posso fare per dire a Jinja di includere solo il file così com'è?

+1

Per chiarire, il file esterno è un insieme di baffi javascript modelli che vengono utilizzati in più posti. Non voglio modificarli, ma includili come nel codice sorgente HTML. –

risposta

17

è possibile definire una funzione per caricare il file di testo e renderlo nel modello:

import jinja2 

def include_file(name): 
    return jinja2.Markup(loader.get_source(env, name)[0]) 

loader = jinja2.PackageLoader(__name__, 'templates') 
env = jinja2.Environment(loader=loader) 
env.globals['include_file'] = include_file 

def render(): 
    return env.get_template('page.html').render() 

if __name__ == '__main__': 
    print render() 

Nel modello, chiamare in questo modo:

{{ include_file('file.txt') }} 
+1

Grazie ... speravo che ci fosse un metodo o un plug-in integrato che mi ero perso, ma ci andrò. –

+0

Ciao, Alex non ho ricevuto risultati durante l'utilizzo del codice perché l'utilizzo di alcuni parametri non è definito. "(loader.get_source (env, name)" Puoi spiegare in dettaglio – cSharma

4

Prova a mettere la sintassi negli altri file in {% raw %} {% endraw %}

È possibile utilizzare jQuery se non volete modificare i file esterni: fare un tuffo per contenere il contenuto <div id="contentoffile"></div>

e utilizzare jQuery per caricare il file: $("#contentoffile").load("url to file") < < l'URL può essere relativo

+0

Funziona, ma il punto è che non voglio modificare i file inclusi. Sono esterni e vengono usati in altri posti. –

+1

Grazie per il suggerimento ajax ... Sto cercando di evitare la richiesta extra, però. Non vedo perché ho bisogno di fare un altro roundtrip quando i file sono proprio lì quando viene eseguito il rendering del modello. –

9

Se si utilizza Flask si può essere scritto in questo modo:

from jinja2 import Markup 

... 

app.jinja_env.globals['include_raw'] = lambda filename : Markup(app.jinja_loader.get_source(app.jinja_env, filename)[0]) 

E usato in questo modo:

{{ include_raw('js-inline/modernizr.min.js') }} 

Il percorso del file incluso è relativo alla cartella del modello come per gli oggetti normali.

1

Come aggiornamento alla risposta di @ Alex, è possibile utilizzare il decoratore @contextfunction di Jinja per rimuovere parte della dipendenza dalle variabili globali. Il codice aggiornato sarà simile:

import jinja2                                                 

@jinja.contextfunction                                               
def include_file(ctx, name):                                             
    env = ctx.environment                                              
    return jinja2.Markup(env.loader.get_source(env, name)[0])                                     


def main():                                                  
    loader = jinja2.PackageLoader(__name__, 'templates')                                      
    env = jinja2.Environment(loader=loader)                                          
    env.globals['include_file'] = include_file                                         

    env.get_template('page.html').render()                                          


if __name__ == '__main__':                                              
    print main() 

E proprio come prima, lo chiamano dal modello come:

{{ include_file('file.txt') }} 
+0

ma non stai passando il parametro 'ctx' dal metodo?!? – cSharma

+0

Il decoratore '@ contextfunction' lo fornisce. [Docs] (http: //jinja.pocoo.org/docs/dev/api/#jinja2.contextfunction) – lsowen

+0

Quando richiamo la funzione genera un errore poiché è richiesto un altro parametro ... – cSharma

Problemi correlati