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 のマクロを使って、テンプレートと分離する形かなぁ。