Skip to main content

Zenmanage Python SDK

PyPI version CI Codacy Badge Coverage

Add feature flags to your Python application in minutes. Control feature rollouts, A/B test, and manage configurations without deploying code.

Why Zenmanage?

  • Fast: rules cached locally for low-latency evaluation
  • Targeted: roll out by user, organization, or custom attributes
  • Safe: graceful defaults and typed accessors
  • Insightful: optional usage reporting
  • Testable: deterministic rollout logic and isolated rule engine

Installation

pip install zenmanage

Requirements: Python 3.9+

Key Compatibility

  • Supported in Python SDK: case-sensitive server keys prefixed with srv_
  • Not supported in Python SDK: client keys (cli_) and mobile keys (mob_) (initialization fails fast)

Get Started in 60 Seconds

  1. Get your server key (srv_...) from zenmanage.com
  2. Initialize the SDK:
from zenmanage import ConfigBuilder, Zenmanage

zenmanage = Zenmanage(
    ConfigBuilder.create()
    .with_environment_token("srv_your_server_key_here")
    .build()
)
  1. Check a feature flag:
flag = zenmanage.flags().single("new-dashboard", False)

if flag.is_enabled():
    show_new_dashboard()
else:
    show_old_dashboard()

Common Use Cases

Async Frameworks (FastAPI, Starlette, etc.)

from zenmanage import AsyncZenmanage, ConfigBuilder, Context

zenmanage = AsyncZenmanage(
    ConfigBuilder.from_environment().build()
)

async def is_enabled_for_user(user_id: str) -> bool:
    context = Context.single("user", user_id)
    flag = await zenmanage.flags().with_context(context).single("new-dashboard", False)
    return flag.is_enabled()

Remember to close the async client on shutdown:

await zenmanage.aclose()

Roll Out a New Feature Gradually

from zenmanage import Context

context = Context.single("user", user_id, user_name)

beta_access = (
    zenmanage.flags()
    .with_context(context)
    .single("beta-program", False)
    .is_enabled()
)

if beta_access:
    enable_beta_features()

A/B Testing

from zenmanage import Attribute, Context

context = Context.single("user", user.id, user.name)
context.add_attribute(Attribute.from_strings("country", [user.country]))
context.add_attribute(Attribute.from_strings("plan", [user.subscription_plan]))

variant = (
    zenmanage.flags()
    .with_context(context)
    .single("checkout-flow", "multi-page")
    .as_string()
)

if variant == "one-page":
    render_one_page_checkout()
else:
    render_multi_page_checkout()

Percentage Rollouts

from zenmanage import Context

context = Context.single("user", user_id)

flag = (
    zenmanage.flags()
    .with_context(context)
    .single("new-checkout-flow", False)
)

if flag.is_enabled():
    render_new_checkout()
else:
    render_classic_checkout()

How it works:

  • Configure rollout percentage (0-100) and salt in Zenmanage
  • SDK computes CRC32B bucket from salt:contextIdentifier
  • Same user always lands in same bucket
  • Increasing percentage only adds users, never removes included users

Use Defaults Across Many Flags

from zenmanage import DefaultsCollection

defaults = DefaultsCollection.from_dict(
    {
        "new-ui": True,
        "api-version": "v2",
        "max-items": 100,
    }
)

flag_manager = zenmanage.flags().with_defaults(defaults)
new_ui = flag_manager.single("new-ui").as_bool()

Fetch All Flags

for flag in zenmanage.flags().all():
    print(flag.key, flag.get_value())

Configuration

import logging

config = (
    ConfigBuilder.create()
    .with_environment_token("srv_your_server_key_here")
    .with_cache_ttl(3600)
    .with_cache_backend("memory")  # memory | filesystem | null
    .with_cache_directory(".cache/zenmanage")  # required for filesystem
    .with_usage_reporting(True)
    .with_api_endpoint("https://api.zenmanage.com")
    .with_logger(logging.getLogger("my-app"))
    .build()
)

You can also load from environment variables:

  • ZENMANAGE_ENVIRONMENT_TOKEN
  • ZENMANAGE_CACHE_TTL
  • ZENMANAGE_CACHE_BACKEND
  • ZENMANAGE_CACHE_DIR
  • ZENMANAGE_ENABLE_USAGE_REPORTING
  • ZENMANAGE_API_ENDPOINT
config = ConfigBuilder.from_environment().build()

Cache Backends

  • memory: default, fastest, process-local
  • filesystem: durable between process restarts
  • null: disables caching

Custom cache objects are supported with with_cache(...) as long as they implement get, set, has, delete, and clear.

Examples

See examples/README.md for runnable examples:

  • simple-flags
  • ab-testing
  • caching
  • context-based-flags
  • defaults
  • percentage-rollouts
  • django-integration
  • flask-integration
  • fastapi-async

Framework integrations: docs/FRAMEWORK_INTEGRATIONS.md

License

MIT

Release files for zenmanage 1.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for zenmanage 1.1.1
File Size Uploaded
zenmanage-1.1.1.tar.gz 25.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for zenmanage 1.1.1
File Interpreter ABI Platform
zenmanage-1.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 50.0 kB

Release files / zenmanage-1.1.1.tar.gz

Download URL zenmanage-1.1.1.tar.gz
Size 25.9 kB
Tags Source
SHA-256 checksum
How to use checksums
d660225633474504b20d2392d9acd7fe79cfc7fda40fff8a7d2676fba3cfd7f0
BLAKE2b-256 checksum
How to use checksums
9b7a74ccd5b7d10256c10263382d233e9e6d4ca1415bc9d5caf8cd36fa5bce4e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.13

Release files / zenmanage-1.1.1-py3-none-any.whl

Download URL zenmanage-1.1.1-py3-none-any.whl
Size 24.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
90a9b33668a59900c2ce856162905eda5cd86d3e7cf16f2ae17b7db2b22f933a
BLAKE2b-256 checksum
How to use checksums
e7a8b9379f080dfef61bdf5f8a74b1976b323806827efe8e7f572591fe885333
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.13

Release history Release notifications | RSS feed

1.2.0

2 release files

1.1.3

2 release files

1.1.2

2 release files

This release

1.1.1 This release

2 release files

1.1.0

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page