3.6 使用Flask-Moment本地化日期和时间

如果 Web 应用的用户来自世界各地,那么处理日期和时间可不是一个简单的任务。

服务器需要统一时间单位,这和用户所在的地理位置无关,所以一般使用协调世界时 (UTC,coordinated universal time)。不过用户看到 UTC 格式的时间会感到困惑,他们更希望看到当地时间,而且采用当地惯用的格式。

要想在服务器上只使用 UTC 时间,一个优雅的解决方案是,把时间单位发送给 Web 浏览 器,转换成当地时间,然后用 JavaScript 渲染。Web 浏览器可以更好地完成这一任务,因 为它能获取用户计算机中的时区和区域设置。

有一个使用 JavaScript 开发的优秀客户端开源库,名为 Moment.js,它可以在浏览器中渲染 日期和时间。Flask-Moment 是一个 Flask 扩展,能简化把 Moment.js 集成到 Jinja2 模板中 的过程。Flask-Moment 使用 pip 安装:

$ pip3 install flask-moment

这个扩展的初始化方法与 Flask-Bootstrap 类似,所需的代码如示例 3-11 所示。

示例 3-11 hello.py:初始化 Flask-Moment

from flask_moment import Moment 
moment = Moment(app)

除了 Moment.js,Flask-Moment 还依赖 jQuery.js。因此,要在 HTML 文档的某个地方引入 这两个库,可以直接引入,这样可以选择使用哪个版本,也可以使用扩展提供的辅助函 数,从内容分发网络(CDN,content delivery network)中引入通过测试的版本。

Bootstrap 已经引入了 jQuery.js,因此只需引入 Moment.js 即可。

示例 3-12 展示了如何在基模板的 scripts 块中引入这个库,同时还保留基模板中定义的原始内容。

注意,这个区块在 Flask-Bootstrap 的基模板中已经预定义,因此放在 templates/base.html 的任何位置都行。

示例 3-12 templates/base.html:引入 Moment.js 库

{% block scripts %}
{{ super() }}
{{ moment.include_moment() }} 
{% endblock %}

为了处理时间戳,Flask-Moment 向模板开放了 moment 对象。示例 3-13 中的代码把变量 current_time 传入模板进行渲染。

示例 3-13 hello.py:添加一个 datetime 变量

from datetime import datetime

@app.route('/')
def index():
    return render_template('index.html', current_time=datetime.utcnow())

示例 3-14 展示了如何渲染模板变量 current_time。

示例 3-14 templates/index.html:使用 Flask-Moment 渲染时间戳

<p>The local date and time is {{ moment(current_time).format('LLL') }}.</p> 
<p>That was {{ moment(current_time).fromNow(refresh=True) }}</p>

format('LLL') 函数根据客户端计算机中的时区和区域设置渲染日期和时间。参数决定了 渲染的方式,从 'L' 到 'LLLL' 分别对应不同的复杂度。format() 函数还可接受很多自定义 的格式说明符。

第二行中的 fromNow() 渲染相对时间戳,而且会随着时间的推移自动刷新显示的时间。

这个时间戳最开始显示为“a few seconds ago”,但设定 refresh=True 参数后,其内容会随着 时间的推移而更新。

如果一直待在这个页面,几分钟后会看到显示的文本变成“a minute ago”“2 minutes ago”,等等。

在 index.html 模板中添加这两个时间戳之后,http://localhost:5000/ 路由对应的页面如图 3-3 所示。

图 3-3:页面中的两个时间戳由 Flask-Moment 处理

Flask-Moment 实现了 Moment.js 的 format()、fromNow()、fromTime()、calendar()、valueOf() 和 unix() 等方法。请查阅 Moment.js 的文档(http://momentjs.com/docs/#/displaying/),学习这个库提供的全部格式化选项。

  • Flask-Moment 假定服务器端应用处理的时间戳是“纯正的”datetime 对象, 且使用 UTC 表示。关于纯正和细致的日期和时间对象 1 的说明,请阅读标准 库中 datetime 包的文档(https://docs.python.org/3.6/library/datetime.html)。

Flask-Moment 渲染的时间戳可实现多种语言的本地化。语言可在模板中选择,方法是在引 入 Moment.js 之后,立即把两个字母的语言代码传给 locale() 函数。例如,配置 Moment. js 使用西班牙语的方式如下:

{% block scripts %}
{{ super() }}
{{ moment.include_moment() }} 
{{ moment.locale('es') }}
{% endblock %}

使用本章介绍的各项技术,你应该能为应用编写出现代化且对用户友好的网页。下一章将 介绍本章没有涉及的一个模板功能,即如何通过 Web 表单与用户交互。

《基于Python的Web应用开发实战(第二版)》

posted @ 2019-01-07 14:24  °❆黄雷❄°  阅读(662)  评论(0编辑  收藏  举报