烧瓶特征标记
flask-pancake的Python项目详细描述
烧瓶薄饼
烧瓶特征标记
这个图书馆深受 django-waffle。在
安装
flask-pancake
依赖于Redis和flask-redisPython包。在
$ python -m pip install flask-pancake Successfully installed flask-pancake^{pr2}$
或者,如果使用create_app()
方法配置Flask应用程序,
使用pancake.init_app()
:
fromflaskimportFlaskfromflask_pancakeimportFlaskPancakepancake=FlaskPancake()defcreate_app()->Flask:app=Flask(__name__)app.secret_key="s3cr!t"pancake.init_app(app)returnapp
使用
flask-pancake
提供三种类型的标志:
- 在
在Switch
es,它们要么是全局活动的,要么是非活动的。通用用例 因为它们是在系统范围内启用或禁用某个功能。E、 g.在 依赖于第三方服务的上下文,使用 服务不可用时的全局切换。在 - 在
Flag
s类似于开关,但可以为单个组重写。到 利用Flag
s,需要定义至少一个返回 组的唯一ID或None
。组可以是任何你想要的用户 分组依据:其用户ID(允许每个用户启用/禁用 特性),用户的属性,如“is_superuser”或“is_staff”,或 还有什么你能想到的。在分组按顺序进行试验。将使用第一个匹配的。意思是, 应该先定义更具体的功能,然后再定义不太具体的功能。在
fromflaskimportrequestfromflask_pancakeimportFlaskPancakedefget_group_user():# If the `request` object has a `user` attribute and the `user` object# has a `uid` attribute, return that.returngetattr(getattr(request,"user",None),"uid",None)defget_group_superuser():# If the `request` object has a `user` attribute and the `user` object# has an `is_superuser` attribute, return "y" if that is boolean `True`# or "n" if it isn't.returngetattr(getattr(request,"user",None),"is_superuser",None)and"y"or"n"# Alternatively, instead of using `get_group_superuser()` one can use a# slightly more verbose class-based approach which has the added benefit# of adding additional value to the flask-pancake overview API view (see# below).classIsSuperuser(GroupFunc):def__call__(self)->str:returngetattr(getattr(request,"user",None),"is_superuser",None)and"y"or"n"defget_candidate_ids(self)->List[str]:return["yes","no"]pancake=FlaskPancake(group_funcs={"user":get_group_user,"superuser":get_group_superuser}# alternatively if using the class-based approach:# group_funcs={"user": get_group_user, "superuser": IsSuperuser})# Or, if importing a function from somewhere isn't possible, a string based# approach can be used.# Separate the the fully qualified module path from the function with a `:`pancake=FlaskPancake(group_funcs={"user","my.app.account.utils:get_group_user","superuser","my.app.account.utils:get_group_superuser",# alternatively if using the class-based approach:"superuser","my.app.account.utils:IsSuperuser",})
在这个例子中,每当一个人检查
Flag
,FlaskPancake就会检查 已按以下顺序设置值:- 标志是否为当前用户禁用/启用?在
- 如果不是,标志是否为超级用户/非超级用户禁用/启用?在
- 如果没有,标志是否默认为禁用/启用?在
- 在
Sample
s,全局“比率”为0-100%。第一次检查样品时 在请求中,在这些边界内检查一个随机值。如果是更低的或者 等于设定值,它是活动的,如果它更大,它就不活动。在由于随机性,样本将其状态存储在请求上下文中(Flask的
g
上下文对象)。此外,为了提供一致的行为 用户在请求之间,请求中使用的示例的值为 存储在用户浏览器的cookie中。然后将它们装载到下一个 再次请求,从而提供跨请求的稳定行为。在这意味着,尽管存在随机性,但这种行为实际上是安全的:
deffoo():ifMY_SAMPLE.is_active():# do somethingpass...ifMY_SAMPLE.is_active():# do morepass
在
使用
clear()
方法。在
类似地,可以使用
他们的disable()
和enable()
方法。Sample
可以使用
set(value: float)
方法。在
当使用Flag
时,有{clear_all_group(group_id)
方法,清除当前或全部的状态
组中的用户。沿着同一条线,有disable_group(group_id)
和enable_group(group_id)
来设置当前用户所属组的状态
的。在
网络API
flask-pancake
提供一个API端点,该端点显示所有可用的Flag
s,
Sample
s和{/status
路由下的所有功能标志。API可以
通过注册烧瓶蓝图启用:
fromflaskimportFlaskfromflask_pancakeimportFlaskPancake,blueprintapp=Flask(__name__)app.secret_key="s3cr!t"pancake=FlaskPancake(app)app.register_blueprint(blueprint,url_prefix="/pancakes")
警告:API没有任何安全措施!你应该用烧瓶的
^{/overview
端点添加一些身份验证的功能。检查
^{
注意:/status
API端点将由前端使用
应用程序加载所有Flag
的状态,
Sample
s和{/status
端点,将特性标志分成两个FlaskPancake
扩展名
实例,并且只允许访问服务于前端的/status
端点
功能标志. 在
如上所述,Sample
s在请求之间的cookie中存储它们的状态。这个
cookie name默认为扩展名,但可以显式设置
在实例化FlaskPancake()
时使用cookie_name
参数
扩展。cookie选项也是如此:默认情况下,将设置cookies
具有HttpOnly
和SameSite=Lax
属性。cookie选项已传递
到Werkzeug's ^{
fromflaskimportFlaskfromflask_pancakeimportFlaskPancakeapp=Flask(__name__)app.secret_key="s3cr!t"pancake=FlaskPancake(app,name="feature-flags",cookie_name="ff",cookie_options={"httponly":True,"samesite":"Lax","secure":True},)
命令行界面
flask-pancake
附带了一个CLI,它钩住了Flask自己的CLI。与调用flask run
以开发模式启动应用程序的方式相同,可以调用flask pancake
。以下是一些示例:
$ flask pancake Usage: flask pancake [OPTIONS] COMMAND [ARGS]... Commands to manage flask-pancake flags, samples, and switches.Options: --help Show this message and exit.Commands: flags samples switches$ flask pancake flags list DO_SOMETHING_ELSE: Yes (default: Yes)FOO_CAN_DO: No (default: No)$ flask pancake flags enable FOO_CAN_DO Flag 'FOO_CAN_DO' enabled.$ flask pancake flags list DO_SOMETHING_ELSE: Yes (default: Yes)FOO_CAN_DO: Yes (default: No)
- 项目
标签: