1. 程式人生 > >【Flask】 使用Flask-Moment進行日期時間的管理

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

構造方法 turn 一個 間距 res 默認 所在地 調用 block

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

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