Zenmanage Python SDK
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
- Get your server key (
srv_...) from zenmanage.com - Initialize the SDK:
from zenmanage import ConfigBuilder, Zenmanage
zenmanage = Zenmanage(
ConfigBuilder.create()
.with_environment_token("srv_your_server_key_here")
.build()
)
- 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_TOKENZENMANAGE_CACHE_TTLZENMANAGE_CACHE_BACKENDZENMANAGE_CACHE_DIRZENMANAGE_ENABLE_USAGE_REPORTINGZENMANAGE_API_ENDPOINT
config = ConfigBuilder.from_environment().build()
Cache Backends
memory: default, fastest, process-localfilesystem: durable between process restartsnull: 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.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| zenmanage-1.1.3.tar.gz | 28.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| zenmanage-1.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 53.7 kB
Release files / zenmanage-1.1.3.tar.gz
| Download URL | zenmanage-1.1.3.tar.gz |
|---|---|
| Size | 28.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f92b55646151560148f6fdbf23500a2a33fb7d3c472f000b9054d71f6335052e
|
|
BLAKE2b-256 checksum How to use checksums |
74e3eaa01eaf4895a1f8d918a7511374020e5b0cd0bb9c3ad2051d77c4f29581
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|
Release files / zenmanage-1.1.3-py3-none-any.whl
| Download URL | zenmanage-1.1.3-py3-none-any.whl |
|---|---|
| Size | 25.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
239fa7e7a9c8718d10ae99665af279ddbcb8204dd5031b182d2d07a0222c8cae
|
|
BLAKE2b-256 checksum How to use checksums |
2ef7a524de0b3b271b07e4db009fa62b196e63716c2b1707d7e7de2df335f0b8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|