In het eerste en tweede deel van deze driedelige zelfstudieserie hebben we gezien hoe de sjabloonstructuur in een op Flask-gebaseerde applicatie met behulp van Jinja2 op een modulaire manier is ingedeeld en hoe aangepaste contextprocessors, filters en macro's in Jinja2 kunnen worden gemaakt.
In dit deel bespreken we hoe u geavanceerde datum- en tijdopmaak op sjabloonniveau implementeert in Jinja2 met behulp van moment.js.
Het formatteren van datum en tijd is een pijnlijke zaak in webtoepassingen. Het gebruik ervan op het niveau van Python, met behulp van de datetime-bibliotheek, verhoogt de overhead en is behoorlijk ingewikkeld als het gaat om het correct omgaan met tijdzones. We moeten de tijdstempels standaardiseren naar UTC wanneer deze in de database worden opgeslagen, maar dan moeten de tijdstempels worden verwerkt elke keer dat ze moeten worden gepresenteerd aan de gebruikers wereldwijd.
Het is slim om deze verwerking uit te stellen aan de clientzijde, dat wil zeggen de browser. De browser kent altijd de huidige tijdzone van de gebruiker en kan de datum- en tijdmanipulatie correct uitvoeren. Dit neemt ook de nodige overhead van onze applicatieservers af.
Net als elke andere JS-bibliotheek kan Moment.js op de volgende manier in onze app worden opgenomen. We zullen alleen het JS-bestand moeten plaatsen, moment.min.js
, in de static / js
map. Dit kan vervolgens in ons HTML-bestand worden gebruikt door de volgende verklaring samen met andere JS-bibliotheken toe te voegen:
Het basisgebruik van Moment.js wordt weergegeven in de volgende code. Dit kan worden gedaan in de browserconsole voor JavaScript:
>>> moment (). calendar (); "Vandaag om 21:37" >>> moment (). EndOf ('day'). FromNow (); "in 2 uur" >>> moment (). formaat ('LLLL'); "Woensdag 27 januari 2016 21:38"
Om Moment.js in onze applicatie te gebruiken, is de beste manier om een wrapper in Python te schrijven en deze via te gebruiken jinja2
omgevingsvariabelen. Raadpleeg dit uitvoerbaar voor meer achtergrondinformatie. Voeg een bestand toe met de naam momentjs.py
op hetzelfde niveau als my_app.py
.
from jinja2 import Markup class momentjs (object): def __init __ (self, timestamp): self.timestamp = timestamp # Wrapper to call moment.js methode def render (self, format): return Markup (""% (self.timestamp.strftime ("% Y-% m-% dT% H:% M:% S "), indeling)) # Format time def-indeling (self, fmt): return self.render (" format " (\ "% s \") "% fmt) def calendar (self): return self.render (" calendar () ") def fromNow (self): return self.render (" fromNow () ")
Voeg de volgende regel toe flask_app / my_app.py
na app
initialisatie. Hiermee wordt de momentjs
les naar jinja
omgevingsvariabelen.
# Stel jinja-template globale app.jinja_env.globals in ['momentjs'] = momentjs
Nu kan moment.js als volgt worden gebruikt om datum en tijd in sjablonen op te maken:
Huidige tijd: momentjs (timestamp) .calendar ()
Tijd: momentjs (timestamp) .format ('YYYY-MM-DD HH: mm: ss')
Vanaf nu: momentjs (timestamp) .fromNow ()
In deze tutorialserie hebben we de basisbeginselen van Jinja2-templating bekeken vanuit het perspectief van Flask. We zijn begonnen met de basisbeginselen van Jinja2 en hebben de best practices geleerd over hoe je de sjabloonstructuur kunt indelen en overervingspatronen kunt gebruiken.
Vervolgens hebben we enkele aangepaste contextprocessors, filters en macro's gemaakt die erg handig zijn bij geavanceerde sjablonen. De laatste tutorial behandelde hoe Moment.Js samen met Jinja2 kan worden gebruikt om zeer flexibele en krachtige datetime-opmaak te maken.