Sometimes you don't want to use the config file to store your feature flags. You can use these premade modules to use other backends.
You'll need Flask-SQLAlchemy:
pip install Flask-SQLAlchemy
Then, in your app, add the SQLAlchemyFeatureFlags
handler:
from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy import flask_featureflags as feature_flags from flask_featureflags.contrib.sqlalchemy import SQLAlchemyFeatureFlags app = Flask(__name__) db = SQLAlchemy(app) ff = feature_flags.FeatureFlag(app) ff.add_handler(SQLAlchemyFeatureFlags(db))
It will automatically create a table to store your flags in, or you can override by passing in your own model:
ff.add_handler(SQLAlchemyFeatureFlags(db, model=MyModel))
InlineFeatureFlag
checks for any flag in app's config with FEATURE_FLAGS_X format,
where X is the name of a specific feature.
The difference between this handler and default handler is,
instead of defining flag in dict
-style:
FEATURE_FLAGS {
'finished': False,
}
the feature name must use uppercased plain string:
FEATURE_FLAGS_FINISHED = False
The motivation behind this inline handler is to interopt with other Flask extensions that rely on environment variable, e.g. Flask-AppConfig.
A typical usage is as trivial as the following snippet:
from flask import Flask
import flask_featureflags as feature_flags
from flask_featureflags.contrib.inline import InlineFeatureFlag
# feature flags config
FEATURE_FLAGS_FINISHED = False
app = Flask(__name__)
app.config.from_object(__name__)
ff = feature_flags.FeatureFlag(app)
ff.add_handler(InlineFeatureFlag())
@app.route("/")
def index():
return "Homepage"
@app.route("/new")
@feature_flags.is_active_feature("FINISHED", redirect_to="/")
def new():
return "New feature"