【Flask】 使用Flask-Moment進行日期時間的管理

Flask-Momenthtml

  Flask-Moment又是一個flask的擴展模塊,用來處理時間日期等信息。用這個模塊主要是考慮到兩點,第一是爲了讓不一樣時區的用戶看到的都是各自時區的實際時間,而不是服務器所在地的時間。第二是對於一些時間間隔的處理,若是要手動處理很麻煩,若是有模塊就很好了。前端

■  簡介python

  pip install flask-moment  來安裝這個擴展模塊。值得一提的是,單單在後臺裝好這個拓展模塊是不夠的,還須要前端的配合,所以前端也要配置好相關的支持庫。按書上說的,使用了由JS開發的moment.js這個庫(http://momentjs.com),它能夠在瀏覽器中根據瀏覽器的本地信息,來幫助渲染從後臺傳過去的日期和時間數據,讓瀏覽者看到的是很友好的本地時間。在安裝Flask-Moment的時候,moment.js已經被安裝到了相關目錄下,咱們在配置Jinja2模板的時候能夠手動地添加一下引用。flask

  好比在template/base.html中:bootstrap

{% 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 %}

 

   後端部分代碼:app

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來行。。),那我也就寫到這裏爲止把。

相關文章
相關標籤/搜索