2013-06-26 11 views
7

Sto provando a scrivere un'app in javascript con la libreria ember.js che fa molto affidamento sul sistema di template di Handlebars. Comunque, sto usando FLASK che usa anche il sistema di template jinja.Puoi utilizzare due modelli HTML come Handlebars e Jinja

È possibile utilizzare entrambi i renderer di modelli contemporaneamente? O devo usare uno su un altro. Chiunque abbia esperienza sia con flask che con ember.js sa quale potrebbe essere più facile sostituire con l'altro? (Forse il manubrio è molto più semplice per sostituire Jinja con o viceversa).

risposta

7

Si noti che questi due modelli di motori si trovano in posizioni diverse. Jinja2 verrà eseguito sul lato server, Handlebars verrà eseguito sul lato client. Potresti potenzialmente usare entrambi senza interferenze se necessario.

Ma con ciò detto, non è davvero necessario utilizzare i modelli lato server se si dispone di un framework client avanzato come ember.js. Nella tua situazione il server Flask probabilmente avrà percorsi che servono i dati tramite le richieste di ajax al client ember.js, quindi il client è davvero il posto migliore per il rendering del template.

+0

Sto usando node.js per il server e sto usando un mix di jade con i modelli di manubri. Jade mi dà ancora e soprattutto il mio designer e un'altra persona non tecnica un file molto semplice da modificare. (Potrebbero ancora modificare l'html grezzo, ma jade è davvero molto pulito) Quando devo inserire le azioni sul manubrio e collegarmi a, uso semplicemente HTML grezzo all'interno del modello. Funziona bene per noi. – WallMobile

+8

Le migliori app web (la maggior parte delle performanti) rendono una pagina html completa al primo caricamento e quindi usano il rendering lato client per aggiornarlo. Affidarsi al client per eseguire il bootstrap completo della pagina iniziale aumenta significativamente il carico della pagina (è necessario effettuare chiamate successive ajax). –

+0

Dovrebbe essere notato - I manubri possono essere resi su entrambi i lati, ma Jinja è raro sul lato client. – cwallenpoole

2

Come diceva @Miguel, non hai davvero bisogno di Jinja2 se usi ember.js, ho capito se non vuoi rendere quei modelli, semplicemente restituisci flask.send_file ('il tuo file html qui') restituendo invece flask.render_template ('il tuo file html qui'). Vedi lo docs per maggiori dettagli.

+2

è ancora meglio avere i file html gestiti come file statici. Durante lo sviluppo, Flask può servirli direttamente dalla cartella "statica". Durante la produzione il tuo server web dovrebbe servire questi file bypassando Flask. Devi usare Flask solo per le richieste Ajax. Buona fortuna con il vostro progetto! – Miguel

1

Sebbene io sia fondamentalmente d'accordo con @Miguel e @Ali, diverse società con cui ho collaborato mischiano il modello RESTful per le API con HTML generato dal server. [NOTA:. Questo non dovrebbe essere il caso quando si utilizza Ember, ma sto lavorando con Flask/Jinja2 e Backbone nella base di codice mio attuale del client]

realtà ho trovato una soluzione che utilizza Pybars, sulla base di alcuni la lettura da Khan Academy's style guide:

@app.template_filter("handlebars") 
def handlebars_filter(context, filepath): 
    source = open(filepath, "r").read().decode('utf-8') 
    template = pybars.Compiler().compile(source) 

    return Markup(u"".join(template(context))) 
3

è possibile contrassegnare le sezioni del codice come {% raw %} dire Jinja2 di ignorarlo. Avvolgi il tuo template manubars.js in tag raw in questo modo:

{% raw %} 
<script id="foo-template" type="text/x-handlebars-template"> 
    <p>{{foo}} - {{bar}}</p> 
</script> 
{% endraw %}