Templerande med Jinja2 i flaskan Formatering av datum och tid med moment.js

I den första och andra delen av den här delhandelsserien ser vi hur man lägger ut mallstrukturen i en flaskbaserad applikation med hjälp av Jinja2 på ett modulärt sätt och hur man skapar anpassade kontextprocessorer, filter och makron i Jinja2. 

I den här delen kommer vi att täcka hur man implementerar avancerad datum- och tidsformatering på mallnivå i Jinja2 med moment.js.

Komma igång

Formatering av datum och tid är en smärtsam sak att hantera i webbapplikationer. Hantering av dem på Pythons nivå, med datetime-biblioteket, ökar överhead och är ganska komplext när det gäller att hantera tidszoner korrekt. Vi bör standardisera tidstämplarna till UTC när de lagras i databasen, men då måste tidstämplarna behandlas varje gång de behöver presenteras för användarna över hela världen.

Det är en smart sak att skjuta upp denna behandling till klientsidan, det vill säga webbläsaren. Webbläsaren känner alltid till den aktuella tidzonen för användaren och kommer att kunna göra datum- och tidsmanipulationen korrekt. Även detta tar bort de nödvändiga kostnaderna från våra applikationsservrar.

Precis som alla JS-bibliotek kan Moment.js ingå i vår app på följande sätt. Vi måste bara placera JS-filen, moment.min.js, i statiska / js mapp. Detta kan sedan användas i vår HTML-fil genom att lägga till följande uttalande tillsammans med andra JS-bibliotek:

Den grundläggande användningen av Moment.js visas i följande kod. Detta kan göras i webbläsarkonsolen för JavaScript:

>>> ögonblick (). kalender (); "Idag kl 09:37" >>> ögonblick (). EndOf ('dag'). FromNow (); "i 2 timmar" >>> moment (). format ('LLLL'); "Onsdag den 27 januari 2016 21:38"

För att använda Moment.js i vår ansökan blir det bästa sättet att skriva ett wrapper i Python och använda det via jinja2 Miljövariabler. Hänvisa till denna runnable för mer bakgrund. Lägg till en fil med namnet momentjs.py på samma nivå som my_app.py.

flask_app / momentjs.py

från jinja2 import Markup klass momentjs (objekt): def __init __ (själv, tidsstämpel): self.timestamp = tidsstämpel # Wrapper att ringa moment.js metod def render (själv, format): returnera Markup (""% (self.timestamp.strftime ("% Y-% m-% dT% H:% M:% S "), format)) # Formatera tid def format (self, fmt): returnera self.render (självständig): return self.render ("calendar ()") def fromNow (self): return self.render ("fromNow ()")

Lägg till följande rad i flask_app / my_app.py efter app initieringen. Detta kommer att lägga till momentjs klass till jinja Miljövariabler.

# Ange jinja mall globala app.jinja_env.globals ['momentjs'] = momentjs

Nu moment.js kan användas för att formatera datum och tid i mallar enligt följande:

Aktuell tid: momentjs (timestamp) .calendar ()


Tid: momentjs (tidsstämpel) .format ('ÅÅÅÅ-MM-DD HH: mm: ss')


Från och med nu: momentjs (timestamp) .fromNow ()

 

Slutsats

I denna tutorial-serie täckte vi grunderna för Jinja2-templerande ur flaskans perspektiv. Vi började med mycket basics av ​​Jinja2 och lärde oss de bästa praxisna på hur man lägger ut mallstrukturen och hävdar arvsmönster. 

Därefter skapade vi några anpassade kontextprocessorer, filter och makron som kommer mycket praktiskt i avancerad templering. Den slutliga handledningen omfattade hur moment.js kan användas tillsammans med Jinja2 för att skapa mycket flexibel och kraftfull datetimeformatering.