• 【Flask】 使用Flask-Moment进行日期时间的管理


    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来行。。),那我也就写到这里为止把。

  • 相关阅读:
    第八节 JS运动基础
    第七节 DOM操作应用-高级
    第六节 DOM操作应用
    第五讲 DOM基础
    第二节 数学基础与语言学基础
    第一节 自然语言处理概论
    第0节 课程简述
    第四节 定时器
    基本概念
    常用命令
  • 原文地址:https://www.cnblogs.com/franknihao/p/7374964.html
Copyright © 2020-2023  润新知