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

时间: 2024-10-14 02:09:16

【Flask】 使用Flask-Moment进行日期时间的管理的相关文章

Flask:05-一首歌的时间掌握flask数据模型(01)

数据模型 数据库回顾 分类: 关系型数据库:MySQL.sqlite.- 非关系型数据库:Redis.MongoDB.- 操作: 执行原生SQL语句,每次都需要拼接SQL语句,非常繁琐而且特别容易出错. ORM(对象关系映射),使用ORM可以通过对对象的操作完成对数据库的操作. flask-sqlalchemy 说明:其实是sqlalchemy扩展库在flask中的移植库,通过了绝大多数关系型数据库的支持(ORM) 安装:pip install flask-sqlalchemy 连接地址配置:

【Flask】Flask Cookie操作

### 什么是cookie:在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个了.cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB.

flask框架----flask基础

知识点回顾 1.flask依赖wsgi,实现wsgi的模块:wsgiref,werkzeug,uwsgi 2.实例化Flask对象,里面是有参数的 app = Flask(__name__,template_folder='templates',static_url_path='/xxxxxx') 3.两种添加路由的方式 方式一: @app.route('/xxxx') # @decorator def index(): return "Index" 方式二: def index():

Java日期时间(Date/Time)

获取当前日期和时间 在Java中容易得到当前的日期和时间.可以使用一个简单的Date对象的toString()方法,如下所示打印当前日期和时间: import java.util.Date; public class DateDemo { public static void main(String args[]) { // Instantiate a Date object Date date = new Date(); // display time and date using toStr

JavaScript日期时间对象的创建与使用(三)

时钟效果一: 代码: <html> <head> <meta charset="utf-8"/> <title>JavaScript日期时间对象的创建与使用</title> </head> <body> <h2 id="time"></h2> <script type="text/javascript"> function Cl

FreeMarker中的日期时间处理

1. FreeMarker中的日期时间格式设置 FreeMarker中可以分别对date.time.datetime三种类型的日期时间设置格式,例如: config.setDateTimeFormat("yyyy-MM-dd HH:mm:ss"); config.setDateFormat("yyyy-MM-dd"); config.setTimeFormat("HH:mm:ss"); 当我们对一个页面变量使用 ?date ?time ?date

Linux日期时间显示输出

1.输出当前年月日 echo $(date +%F) 2014-02-21 2.输出当前时间(时分) echo $(date +%R) 12:45 3.输出当前时间(时分秒) echo $(date +%T) 12:52:51 4.输出星期 echo $(date +%A) 星期五 5.组合输出日期时间 5.1输出年月日 echo $(date +%Y/%m/%d) 2014/02/21 %Y参数: 年 %m参数: 月 %d参数: 日 5.2输出时分秒 echo $(date +%H:%M:%S

c/c++日期时间处理与字符串string转换

在c/c++实际问题的编程中,我们经常会用到日期与时间的格式,在算法运行中,通常将时间转化为int来进行计算,而处理输入输出的时候,日期时间的格式却是五花八门,以各种标点空格相连或者不加标点. 首先,在c中,是有一个标准的日期时间结构体的,在标准库wchar.h内,我们可以看到结构体tm的声明如下: 1 #ifndef _TM_DEFINED 2 struct tm { 3 int tm_sec; /* seconds after the minute - [0,59] */ 4 int tm_

Java 日期时间 Date类型,long类型,String类型表现形式的转换 (转)

Java 日期时间 Date类型,long类型,String类型表现形式的转换 1.java.util.Date类型转换成long类型java.util.Date dt = new Date();System.out.println(dt.toString());   //java.util.Date的含义long lSysTime1 = dt.getTime() / 1000;   //得到秒数,Date类型的getTime()返回毫秒数 2.由long类型转换成Date类型SimpleDat