Try   HackMD

Flask實作_ext_16_Flask_babel_日期時間

tags: flask flask_ext python babel

flask_babel包裝了babel讓Flask用戶可以便捷的使用它,不管如何,官方文件都很建議要閱讀過一次,至少知道這個package的用途,當然,其它還有如gettextpytzspeaklater也有其相關性,在了解如何應用之後也記得往下深入理解。

安裝

pip install Flask-Babel

安裝的時候會將相依套件babel一併安裝,不需要各別安裝。

說明

直觀來看,babel的應用包括了本地時間、日期、數值的格式化以及多語系的應用,本地(locale)所指的即為en_USzh_TW等設置。

下面是一個官方文件上簡單的設置說明,利用Locale來設置語系,案例中利用Locale.parse來設置語系為zh_TW,如下:

>>>from babel import Locale >>>locale = Locale.parse('zh_TW') >>>locale Locale('zh', territory='TW', script='Hant')

設置本地語系之後,還可以再套其它語系來顯示想顯示的資訊,雖然本地語系已經設置為zh_TW,但是還是可以再讓顯示的資訊以en_US來呈現,如下範例:

>>>locale.get_display_name() '中文 (繁體, 台灣)' >>>locale.get_display_name('en_US') 'Chinese (Traditional, Taiwan)'

上述只是一個簡單的案例來快速理解『本地』所指的意函,因此當語系切換的時候,呈現的資訊就可以依著語系來變動。

時間與日期的部份可以結合Python的datetimedatetime等package一起使用,更細部份的部份當然還是會希望直接的看官方文件一次,至少理解到包裝起來的babel能提供的功能。

下面案例是一個日期時間的格式化,將Pythondatetime物件做為format_datetime的參數,再搭配locale來做不同語系的呈現。

>>>from datetime import datetime >>>from babel.dates import format_datetime >>>dt = datetime(2018, 6, 25, 22, 30) >>>format_datetime(dt, locale=locale) '2018年6月25日 下午10:30:00' >>>format_datetime(dt, locale='en_US') 'Jun 25, 2018, 10:30:00 PM'

把鏡頭帶回來flask_babel,Flask的擴展應該可以快速上手了,實作,接著初始化參數,flask_babel的參數不多,只有兩個:

  • BABEL_DEFAULT_LOCALE
    • 預設的語系,沒有設置的話則為en
  • BABEL_DEFAULT_TIMEZONE
    • 預設時區,沒有設置的話則為UTC

了解參數之後,我們就來做實作並初始化,如下:

from flask import Flask from flask.ext.babel import Babel app = Flask(__name__) app.config['SECRET_KEY'] = 'development' app.config['BABEL_DEFAULT_LOCALE'] = 'en' app.config['BABEL_DEFAULT_TIMEZONE']='UTC' babel = Babel(app)

上面我們預設了localeentimezone=UTC,當有不同語系的使用者登入的時候,我們可以在登入的時候利用refresh()來變更。依官方文件說明,babel第一次需要當前用戶的地區的時候,會呼叫localeselector,如果需要時區的時候則是呼叫timezoneselector,如果回傳None的話,就會取參數設置的預設值了。

範例

千言萬語都不如動手來操作,剛才我們看過了babel的簡單示範,現在來認識一下flask-babel

範例的部份都是直接在Command上操作,所以有『>>>』就是指令,沒有的就是結果

>>>from flask import Flask >>>from flask_babel import Babel >>>from flask_babel import format_datetime, get_locale >>>from datetime import datetime >>>app = Flask('tt') >>>babel = Babel(app) >>>dt = datetime(2018, 6, 26, 21, 30) >>>print(dt) datetime.datetime(2018, 6, 26, 21, 30) # 未推入一個request之前如果使用get_locale,雖然不會報錯,但是不會有回傳的值 >>>get_locale() # 測試用,加入一個request,如果沒有加入會報錯 >>>app.test_request_context().push() >>>format_datetime(dt) 'Jun 26, 2018, 9:30:00 PM' >>>babel.default_locale Locale('en')

第7行:單純的設置一個datetime物件dt,年、月、日、時、分
第11行:測試的時候可以透過test_request_context().push()來手動模擬一個request
第12行:格式化日期,回傳的格式是很明顯的是en
第14行:檢查預設的default_locale,可以發現到,即使我們沒有設置參數,預設上還是以en為主。

接續著上例,如果現在切換語言至zh_TW,那可以透過refresh()來做一個locale的更新

>>>y = lambda: 'zh' >>>babel.localeselector(y) >>>get_locale() Locale('en') >>>refresh() >>>get_locale() Locale('zh') >>>format_datetime(dt) '2018年6月26日 下午9:30:00' >>>format_datetime(dt, 'short') '2018/6/26 下午9:30'

第1行:利用lambda來設置一個簡單的函數,回傳zh
第2行:利用babel.localeselector來模擬用戶登入之後取得他的語系
第3行:執行refresh之前還是回傳en
第5行:執行refresh之後還是回傳zh
第7行:執行format_datetime顯示的格式已經是zh_TW的格式
第9行:加入參數short,另外還有不少調控的格式,這部份請參閱官方文件

總結

這篇很快速的了解了babel於日期、時間格式化的應用,簡單的幾個案例,我們大概對將babel加入專案的時候該怎麼結合登入功能的部份心裡有底,另篇會針對babel應用在多語系說明,繼續了解。

Flask_babel_多語系:Flask實作_ext_17_Flask_babel_多語系