• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

在Flask中使用Jinja2进行模板化:使用moment.js进行日期和时间格式化

在这一部分中,我们将介绍如何在 jinja2 中使用moment.js在模板级别实现高级日期和时间格式化。

入门

在 Web 应用程序中处理日期和时间格式是一件很痛苦的事情。python 级别使用 datetime 库处理它们会增加开销,并且在正确处理时区时非常复杂。当存储在数据库中时,我们应该将时间戳标准化为 UTC ,但是每次需要将时间戳呈现给全球用户时都需要对其进行处理。

将此处理推迟到客户端即浏览器是一件聪明的事情。浏览器总是知道用户的当前时区,并且能够正确地进行日期和时间操作。此外,这消除了我们的应用程序服务器的必要开销。

就像任何 JS 库一样,Moment.js 可以通过以下方式包含在我们的应用程序中。我们只需要将 JS 文件 ,moment.min.js放在static/js文件夹中。然后可以通过添加以下语句以及其他 JS 库在我们的html文件中使用它:

<script src="/static/js/moment.min.js"></script>

Moment.js 的基本用法如以下代码所示。这可以在javascript的浏览器控制台中完成:

>>> moment().calendar();
"Today at 9:37 PM"
>>> moment().endOf('day').fromNow();
"in 2 hours"
>>> moment().format('LLLL');
"Wednesday, January 27, 2016 9:38 PM"

要在我们的应用程序中使用 Moment.js,最好的方法是用 Python 编写一个包装器并通过jinja2环境变量使用它。 有关更多背景信息,请参阅此可运行文件。添加一个momentjs.pymy_app.py.

烧瓶应用程序/momentjs.py

from jinja2 import Markup
 
class momentjs(object):
 
    def __init__(self, timestamp):
        self.timestamp = timestamp
 
        # Wrapper to call moment.js method
        def render(self, format):
            return Markup("<script>\ndocument.write(moment(\"%s\").%s);\n</script>" % (self.timestamp.strftime("%Y-%m-%dT%H:%M:%S"), format))
 
        # Format time
        def format(self, fmt):
            return self.render("format(\"%s\")" % fmt)
 
        def calendar(self):
            return self.render("calendar()")
 
        def fromNow(self):
            return self.render("fromNow()")

初始化flask_app/my_app.py添加以下行。app这会将 momentjs类添加到jinja环境变量中。

# Set jinja template global
app.jinja_env.globals['momentjs'] = momentjs

现在 moment.js 可用于在模板中格式化日期和时间,如下所示:

<p>Current time: {{ momentjs(timestamp).calendar() }}</p>
<br/>
<p>Time: {{momentjs(timestamp).format('YYYY-MM-DD HH:mm:ss')}}</p>
<br/>
<p>From now: {{momentjs(timestamp).fromNow()}}</p>

结论

在本教程系列中,我们从 Flask 的角度介绍了 Jinja2 模板的基础知识。我们从非常基础的 Jinja2 开始,学习了如何布局模板结构和利用继承模式的最佳实践。 

然后我们创建了一些自定义上下文处理器、过滤器和mac ros,它们在高级模板中非常方便。最后的教程介绍了如何将 moment.js 与 Jinja2 一起使用来创建高度灵活和强大的日期时间格式。


文章目录
  • 入门
    • 烧瓶应用程序/momentjs.py
  • 结论