Flask扩展之Flask-Moment

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

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

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

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

一 安装

pip3 install flask-moment

二 初始化

该扩展的初始化方式和Flask-Bootstrap类似,具体代码如下:

from flask_moment import Moment
# ...
moment= Moment(app)
或
moment= Moment()
moment.init_app(app)

三 引入相应库

除了Moment.js,Flask-Moment还依赖jQuery.js。因此,要在HTML文档的某个地方引入这两个库,可以直接引入,这样可以选择使用哪个版本,也可以使用扩展提供的辅助函数,从内容分发网络(CDN,content delivery network)中引入通过测试的版本。Bootstrap已经引入了jQuery.js,因此只需要引入Moment.js。我们可以在基模板在scripts块中引入这个库,同时还保留基模板中定义的原始内容。

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

四 渲染

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

from flask import Flask, render_template
from datetime import datetime


app = Flask(__name__)


@main.route('/user/<name>')
def user(name):
	return render_template('user.html',name=name,current_time=datetime.utcnow())

下面示例代码展示前端如何渲染模板变量current_time。

<p>{{ moment(current_time).format('LLL') }}</p>
<p>{{ moment(current_time).fromNow(refresh=True) }}</p>

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

fromNow(refresh=True)渲染相对时间戳,而且会随着时间的推移自动刷新显示的时间。

五 其他

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

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

Flask-Moment实现了Moment.js的format()、fromNow()、fromTime()、calendar()、valueOf()和unix()等方法。

更多可查阅Moment.js文档:https://momentjs.com/docs/#/displaying/

posted @ 2019-08-27 18:58  Joe1991  阅读(182)  评论(0)    收藏  举报