Templating with Jinja2 in Flask Formattazione di data e ora con moment.js

Nella prima e nella seconda parte di questa serie di tutorial in tre parti, abbiamo visto come disporre la struttura del template in un'applicazione basata su Flask usando Jinja2 in maniera modulare e come creare processori contestuali personalizzati, filtri e macro in Jinja2. 

In questa parte, vedremo come implementare la formattazione avanzata di data e ora a livello di modello in Jinja2 usando moment.js.

Iniziare

La formattazione di data e ora è una cosa dolorosa da gestire nelle applicazioni web. Gestendoli a livello di Python, utilizzando la libreria datetime, aumenta il sovraccarico ed è piuttosto complesso quando si tratta di gestire correttamente i fusi orari. Dovremmo standardizzare i timestamp in UTC quando memorizzati nel database, ma i timestamp devono essere elaborati ogni volta che devono essere presentati agli utenti in tutto il mondo.

È una cosa intelligente rimandare questa elaborazione al client, cioè al browser. Il browser conosce sempre il fuso orario corrente dell'utente e sarà in grado di eseguire correttamente la manipolazione della data e dell'ora. Inoltre, questo elimina il sovraccarico necessario dai nostri server delle applicazioni.

Proprio come qualsiasi libreria JS, Moment.js può essere incluso nella nostra app nel modo seguente. Dovremo solo posizionare il file JS, moment.min.js, nel / statici js cartella. Questo può quindi essere utilizzato nel nostro file HTML aggiungendo la seguente istruzione insieme ad altre librerie JS:

L'utilizzo di base di Moment.js è mostrato nel seguente codice. Questo può essere fatto nella console del browser per JavaScript:

>>> momento (). calendario (); "Oggi alle 21:37" >>> moment (). EndOf ('day'). FromNow (); "in 2 ore" >>> momento (). format ('LLLL'); "Mercoledì 27 gennaio 2016 21:38"

Per utilizzare Moment.js nella nostra applicazione, il modo migliore sarà scrivere un wrapper in Python e usarlo tramite Jinja2 variabili ambientali. Fare riferimento a questa eseguibile per ulteriori informazioni. Aggiungi un file chiamato momentjs.py allo stesso livello di my_app.py.

flask_app / momentjs.py

da jinja2 import Markup class momentjs (oggetto): def __init __ (self, timestamp): self.timestamp = timestamp # Wrapper per chiamare moment.js metodo def render (self, format): return Markup (""% (self.timestamp.strftime ("% Y-% m-% dT% H:% M:% S "), formato)) # Formato formato ora def (self, fmt): return self.render (" format (\ "% s \") "% fmt) def calendario (self): return self.render (" calendar () ") def fromNow (self): return self.render (" fromNow () ")

Aggiungi la seguente riga in flask_app / my_app.py dopo App inizializzazione. Questo aggiungerà il momentjs classe a Jinja variabili ambientali.

# Imposta il template jinja globale app.jinja_env.globals ['momentjs'] = momentjs

Ora moment.js può essere utilizzato per formattare data e ora nei template come segue:

Ora corrente: momentjs (timestamp) .calendar ()


Ora: momentjs (timestamp) .format ('YYYY-MM-DD HH: mm: ss ')


Da ora: momentjs (timestamp) .da more ()

 

Conclusione

In questa serie di tutorial, abbiamo trattato le basi del templating di Jinja2 dal punto di vista di Flask. Abbiamo iniziato con le basi di Jinja2 e abbiamo imparato le migliori pratiche su come disporre la struttura dei modelli e sfruttare i modelli di ereditarietà. 

Quindi abbiamo creato alcuni processori di contesto personalizzati, filtri e macro che sono molto utili nei modelli avanzati. L'ultimo tutorial ha illustrato come utilizzare moment.js insieme a Jinja2 per creare una formattazione datetime estremamente flessibile e potente.