Flask の拡張の Python3 対応

今年は本格的に Python3 に移行しようと重い腰を上げた。
まずは自作の Flask のプロジェクトジェネレータを Python3 対応にした。
Application factory 内で itereitems() を使っている所があったので、_compat.py を作りその中で iteritem をラップするものを作る。
# これ自体は Werkzeug の _compat.py を真似た。

PY2 = sys.version_info[0] == 2


if PY2:
    text_type = unicode
    
    iterkeys = lambda d: d.iterkeys()
    itervalues = lambda d: d.itervalues()
    iteritems = lambda d: d.iteritems()
else:
    text_type = str
    
    iterkeys = lambda d: iter(d.keys())
    itervalues = lambda d: iter(d.values())
    iteritems = lambda d: iter(d.items())

Virtualenv で Python3 な環境を作りテストコードを走らせサクッと確認完了。


続いて Flask でアプリケーションを作る際によく使っていた拡張が対応してるか調べた。

extenstion 名 対応? 備考
Flask-Cache ok キャッシュライブラリ
Flask-Principal ok 権限関連のライブラリ
Flask-WTF ok フォーム
Flask-Mail ok メール送信
Flask-Script ok Cli ライブラリ
Flask-Babel ok 国際化関連
Flask-OpenID ng OpenID
Flask-Assets ng JavaScript を一つにまとめたり
Flask-Uploads ng ファイルアップロード
Flask-OAuth ng OAuth
Flask-KVSession ng Flask の Session を Redis とかに差し替える

対応していないので無いと困るなぁというのが Flask-KVSession。
Flask のデフォルトのセッションは Cookie(Rails でいう CookieStore)で、これをサーバサイド(Redis とか Memcached とか)に簡単に差し替えるライブラリ。
ライブラリを使わずに自前でやる場合これを使えばいけそう。
Server-side Sessions with Redis | Flask (A Python Microframework)
あるいは Beaker と Flask を使うのがあるので、それを使えばいけるか?
もう少し考えてみる事にする。


ファイルのアップロードは WTForms のアップロード機能を使えば良い。
Creating Forms — Flask-WTF 0.15


OAuth は Flask-OAuthlib というライブラリがありそっちは Python3 対応しているので、OAuth が必要な場合はそれを使えばよさそう。
Flask-OAuthlib — Flask-OAuthlib 0.9.5 documentation


Flask-Assets で JavaScript とかを一つにまとめるのは、Grunt とかそっちを使って、Node.js でタスクを作っちゃった方が良さそう。


OpenID は…もう使う事があんまりなさそう…。


フルスタックな FW よりも自分でライブラリを組み合わせて作る FW の方が好みだけど、こういう場合に統一が取れなくて困る。
あ、あと Python のライブラリを作る人 tox 使って…。
# tox.ini を見れば対応しているバージョン分かるから
もっともちゃんと tox を使ってる人はちゃんと Python3 対応してるのが多い気がする。