烧瓶特征标记

flask-pancake的Python项目详细描述


烧瓶薄饼

GitHub Workflow Status (branch)Codecov branchPyPI

烧瓶特征标记

这个图书馆深受 django-waffle。在

安装

flask-pancake依赖于Redisflask-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提供三种类型的标志:

  • Switches,它们要么是全局活动的,要么是非活动的。通用用例 因为它们是在系统范围内启用或禁用某个功能。E、 g.在 依赖于第三方服务的上下文,使用 服务不可用时的全局切换。在

  • Flags类似于开关,但可以为单个组重写。到 利用Flags,需要定义至少一个返回 组的唯一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就会检查 已按以下顺序设置值:

    1. 标志是否为当前用户禁用/启用?在
    2. 如果不是,标志是否为超级用户/非超级用户禁用/启用?在
    3. 如果没有,标志是否默认为禁用/启用?在
  • Samples,全局“比率”为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端点,该端点显示所有可用的Flags, Samples和{}es及其在{}下的对应态 蓝图中的路线。它还提供了一个JSON API来获取 当前用户在/status路由下的所有功能标志。API可以 通过注册烧瓶蓝图启用:

fromflaskimportFlaskfromflask_pancakeimportFlaskPancake,blueprintapp=Flask(__name__)app.secret_key="s3cr!t"pancake=FlaskPancake(app)app.register_blueprint(blueprint,url_prefix="/pancakes")

警告:API没有任何安全措施!你应该用烧瓶的 ^{}/overview端点添加一些身份验证的功能。检查 ^{} 举个例子。在

注意:/statusAPI端点将由前端使用 应用程序加载所有Flag的状态, Samples和{}es,并在前端随时可用。如果 我们不希望通过 /status端点,将特性标志分成两个FlaskPancake扩展名 实例,并且只允许访问服务于前端的/status端点 功能标志. 在

如上所述,Samples在请求之间的cookie中存储它们的状态。这个 cookie name默认为扩展名,但可以显式设置 在实例化FlaskPancake()时使用cookie_name参数 扩展。cookie选项也是如此:默认情况下,将设置cookies 具有HttpOnlySameSite=Lax属性。cookie选项已传递 到Werkzeug's ^{} method

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)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何实现INotifyPropertyChanged的RxJava等价物以创建可观察的数据模型?   ArrayList中的java搜索   性能如何在Java中分析对象创建?   java使用arraylist中的运算符组合获取目标编号   java如何在片段中为添加/删除节点(使用grathstream)创建触摸事件?   java向jvm添加不同的p12证书   返回匿名类的新对象的java方法   java如何打开地图中的对象列表   使用socket的聊天应用程序在Java中不在Internet上工作   java可以在清单中定义值。是否可以通过编程方式访问MF?   什么东西(负)是什么意思?   java动态加载jar文件并使用xml创建Springbean   java实体类字符串[]与列表<String>   java自动化测试用例适用于appium命令行工具,但不适用于桌面客户端   java如何在Springboot中从JSON数组中删除元素?   runnable jar中的swing Java While循环不是迭代的,而是在eclipse中运行良好的相同代码   如何从Java中的CosmosDB容器中检索给定分区键的所有文档?   我想将java中数组中的值存储在我自己类型的arrayList中。我该怎么做   使用ApachePOI的java条件格式   java需要编写没有线程的selenium代码。睡觉