Flask-Moment
Flask-Moment又是一个flask的扩展模块,用来处理时间日期等信息。用这个模块主要是考虑到两点,第一是为了让不同时区的用户看到的都是各自时区的实际时间,而不是服务器所在地的时间。第二是对于一些时间间隔的处理,如果要手动处理很麻烦,如果有模块就很好了。
■ 简介
pip install flask-moment 来安装这个扩展模块。值得一提的是,单单在后台装好这个拓展模块是不够的,还需要前端的配合,因此前端也要配置好相关的支持库。按书上说的,使用了由JS开发的moment.js这个库(http://momentjs.com),它可以在浏览器中根据浏览器的本地信息,来帮助渲染从后台传过去的日期和时间数据,让浏览者看到的是很友好的本地时间。在安装Flask-Moment的时候,moment.js已经被安装到了相关目录下,我们在配置Jinja2模板的时候可以手动地添加一下引用。
比如在template/base.html中:
{% block scripts %} //改变的是scripts的这个block,来引入moment.js这个js文件 {{ super() }} {{ moment.include_moment() }} {% endblock %}
从上面的模板代码中可以看到,为了处理时间,Flask-Moment给模板文件开放了moment这个类在模板文件中使用,moment类是有“构造方法”的,其接受一个参数current_time,后台在render_template的时候就可以指定current_time来传递给前端时间信息了。一般而言,这个current_time要求是一个utc时间元组,可以调用datetime.datetime.utcnow()来获取。
■ 实例
下面是一个简单的应用例子:
前端页面模板部分代码:
{% block scripts %} {{ super() }} {{ moment.include_moment() }} //在前端中通过方法引用moment.js文件 {{ moment.locale(‘zh-cn‘) }} //将moment.js本地化,否则渲染出来的时间日期都是英文的 {% endblock %} {% block page_content %} {{ super() }} <h3>Time now is {{ moment(current_time).format(‘LLL‘) }}</h3><hr> {% endblock %}
后端部分代码:
m = Moment(app) #和bootstrap一样,不要忘了这一步,否则前端报找不到moment类的错 @app.route(‘/time‘,methods=[‘GET‘]) def show_time(): return render_template(‘time.html‘,current_time=datetime.datetime.utcnow())
最关键的是前端中的moment(current_time).format这一句。current_time即后端传来的时间元组,不一定要是当前时间。moment类以这个时间元组为依据创建对象,然后调用一些方法来渲染出你想要的时间or日期信息。具体有哪些方法以及方法参数如何选择可以参看site-packages/flask_moment.py这个源码,或者上【http://momentjs.com/docs】这个官方网站看文档。下面介绍几个常用的
● format方法
format方法的参数是日期时间格式,但是表示特别奇特,不是python中常见的%Y-%m-%d这种形式,而是类似于‘YYYY-MM-DD HH:mm:SS‘,这里较为方便地用了LLL,官方文档中给出的LLL对应的格式实例是September 4 1986 8:30 PM。这是在en作为语言的环境下,如果像上面一样在调用方法之前我已经使用了locale进行本地化工作的话,那么现实出的就是符合中国人习惯的时间日期格式了,比如上面这个实例中显示的时间是‘2017年8月16日下午5点32分’。更多详细设定:【http://momentjs.com/docs/#/displaying/format/】
● fromNow方法
fromNow方法显示当前时间距离元素初次被渲染的时间多久了。而且它还接受一个refresh=boolean的参数,默认是False,但是如果改成True,其效果就是如果你待在这个页面,那么每隔一分钟(从flask_moment的源码上来看是一分钟)就刷新一次页面,给出更新后的时间间隔信息。而且为了友好性,它会在时间间隔比较小的时候提示“几秒前”,“1分钟前”,“2分钟前”等等。
与fromNow类似的还有一个fromTime方法,给定时间点,计算当前到那个时间点之间过了多久,需要注意要确保那个时间是在过去而不是在未来,否则就会出现很神奇的计算错误。
额外提下,这些方法都是包装了moment.js中的from方法,与之相对的还有一个to方法,不过flask-moment没有对to系列的计算进行包装。如果直接想要使用moment.js中的一些方法的话可能就需要在模板的script标签中手动写一些JS/JQ代码了。
● calendar方法
上面提到了fromNow等方法会为了信息的友好性而给出一些修饰,calendar方法也是一样,而且是在天和星期级别上的修饰。比如调用calendar()的地方会把调用它的moment对象指定的时间点显示为‘明天晚上6:20‘或者‘上周六中午12:00‘这样的字样。calendar方法也可以设置refresh=True,但不接受除此以外的其他参数。
● valueOf和unix方法
这两个方法都是返回调用它的moment对象所指向那个时间点的时间戳,前者单位是毫秒,后者单位是秒。
moment.js里还有很多很多方法,然而flask_moment只包装了上面几个(这个文件本身一共也就100来行。。),那我也就写到这里为止把。