Flask-Featureflags で呼び出しを制限する
Flask-Featureflags というものを見つけた。
GitHub - trustrachel/Flask-FeatureFlags: A Flask extension that enables or disables features based on configuration.
何をするものかというと、Flask でこの機能はまだ一部のユーザーにベータテストとして見せたいとか、会員のみこの機能を許すみたいな感じで機能制限をできるもの。
app.py
from flask import Flask from features import feature, test_feature from configs import Settings from views import app as view def create_app(): app = Flask(__name__) app.config.from_object(Settings()) app.register_blueprint(view) feature.init_app(app) #feature.add_handler(test_feature) return app if __name__ == '__main__': app = create_app() app.debug = True app.run()
configs.py
class Settings(object): FEATURE_FLAGS = { 'unfinished_feature' : False, }
features.py
from flask.ext.featureflags import FeatureFlag from flask.ext.featureflags import StopCheckingFeatureFlags from models import User feature = FeatureFlag() def test_feature(feature): if User().active is True: return True raise StopCheckingFeatureFlags
models.py
class User(object): _active = False @property def active(self): return self._active
from flask import Blueprint, render_template, request, current_app from flask.ext.featureflags import is_active_feature app = Blueprint('index', __name__) @app.route('/') def index(): return 'index' @app.route('/active') @is_active_feature('unfinished_feature') def active(): return 'active'
ソースコードはこんな感じ。
まずは設定ファイルに
FEATURE_FLAGS = { 'unfinished_feature' : False, }
と書いた場合、view の @is_active_feature('unfinished_feature') がついている uri にアクセスした場合に 404 not found が応答する。
@is_active_feature('unfinished_feature', '/') と第二引数に uri を書いてやると、そこにリダイレクトされる。
設定ファイルだけだと、例えばモデルからそのユーザーがアクティブかどうかを見る事が出来ないので、features.py の test_feature を handler に追加する。
feature.init_app(app) feature.add_handler(test_feature)
で、test_feature は models.py の active を見ているので、そこが True の場合、True を応答するようにした。
これで /active にアクセスした場合、ちゃんと active という文字列が応答される。
上記サンプルはデコレータでメソッド単位の制御を行ったが、if 文で制御する事も出来る。
また Jinja2 のテンプレート上でも制御できる。
テンプレート上で制御出来るという事は、会員と非会員とで表示するコンテンツを制御のような物が出来る。
機能の表示/非表示だけだけど、CookPad の Chanko みたいになったら素敵なのになぁ。
現状 Flask-Featureflags の is_active だと True, False しか返らない。
やるとしたら Jinja2 のマクロを使って、テンプレートと分離する形かなぁ。