Weni feature flags SDK for Python backends
Weni Feature Flags is a Python Library that functions as an abstraction layer between Django projects and GrowthBook.
- Python: 3.8+
- Django: 3.2.22+
- Django REST Framework: 3.12.0+
- Celery: 5.0+
This project also relies on Celery to update feature flags asynchronously. This library uses Django's cache abstraction to avoid hitting the database constantly and also reduce latency.
To install it, you can use both pip or Poetry.
pip install weni-feature-flagspoetry add weni-feature-flagsOn your Django project, you should add "weni.feature_flags" to INSTALLED_APPS. When testing and deploying you should apply the migrations using:
python manage.py migrateThis library saves a snapshot of the feature flags on your database and cache layer to be resilient to eventual GrowthBook unavailability.
Here's a minimal example to get you started:
- Install the package:
pip install weni-feature-flags- Add to Django settings:
# settings.py
INSTALLED_APPS = [
# ... other apps
'weni.feature_flags',
]
# Environment variables
GROWTHBOOK_CLIENT_KEY = "your-client-key"
GROWTHBOOK_HOST_BASE_URL = "https://your-growthbook-instance.com"- Run migrations:
python manage.py migrate- Use in your code:
from weni.feature_flags.shortcuts import is_feature_active
# Check if a feature is active for a user
if is_feature_active("new-dashboard", "[email protected]", "project-uuid"):
# Show new dashboard
passOn GrowthBook, you can create a Python SDK connection, which you generate your client key. You should save this client key and use it as the GROWTHBOOK_CLIENT_KEY environment variable, as well as your GrowthBook host to GROWTHBOOK_HOST_BASE_URL.
Remember to select the correct environment and project on the "New SDK Connection" modal.
You can also configure webhooks to apply feature flags changes faster. For this, first import the webhook view and configure it in your Django project's URLs
from django.urls import path
from weni.feature_flags.views import FeatureFlagsWebhookView
urlpatterns = [
path('webhooks/feature-flags/', FeatureFlagsWebhookView.as_view(), name='feature-flags-webhook'),
]Then, create a strong secret and save it to GROWTHBOOK_WEBHOOK_SECRET.
On Growthbook, access Settings -> Webhooks and create a new event webhook. It should be configured to use POST as the method and, on the Headers (JSON) section, include the secret that you created:
{
"secret": "<YOUR SECRET HERE>"
}You should select the events "feature.created", "feature.updated" and "feature.deleted" and select your environment and project.
You can import and use the whole feature flags service like this:
from weni.feature_flags.services import FeatureFlagsService
service = FeatureFlagsService()
# Get all feature flags data
features = service.get_features()
# Get active feature flags for specific attributes
active_features = service.get_active_feature_flags_for_attributes({
"userEmail": "[email protected]",
"projectUUID": "8065619a-2b22-4351-9914-e37c6394b1d3"
})
# Evaluate a specific feature flag by attributes
is_active = service.evaluate_feature_flag_by_attributes(
"feature-key",
{
"userEmail": "[email protected]",
"projectUUID": "8065619a-2b22-4351-9914-e37c6394b1d3"
}
)If you only really need to check whether a user and project have access to a feature, you can use shortcuts:
from weni.feature_flags.shortcuts import is_feature_active, is_feature_active_for_attributesIf you want to check if a certain user in a certain project has access to a feature, you can use
# feature key/name, user's email, project's UUID
if is_feature_active("featureKey", "[email protected]", "8065619a-2b22-4351-9914-e37c6394b1d3"):
# Something cool happensOr, if you set the feature up in a different way, you can pass the attributes directly using:
# Just checks the project
# feature key/name, attributes
if is_feature_active_for_attributes("featureKey", {"projectUUID": "8065619a-2b22-4351-9914-e37c6394b1d3"}):
pass
# Just checks the user's email
if is_feature_active_for_attributes("featureKey", {"userEmail": "[email protected]"}):
pass
# Or any other rule that you have defined on GrowthBook
if is_feature_active_for_attributes("featureKey", {"example": "test"}):
passThis library creates the following database models:
- FeatureFlag: Stores feature flag definitions and their current state
- FeatureFlagSnapshot: Maintains historical snapshots of feature flags for resilience
- Feature flags are cached using Django's cache framework
- Cache keys are prefixed with
CACHE_KEY_PREFIX(default: "weni_feature_flags") - Cache TTL is configurable via
FEATURES_CACHE_TTL(default: 60 seconds) - When GrowthBook is unavailable, the library falls back to cached data
Feature flags not updating
- Check if Celery is running and processing tasks
- Verify webhook configuration and secret
- Check GrowthBook connection settings
GrowthBook connection errors
- Verify
GROWTHBOOK_CLIENT_KEYandGROWTHBOOK_HOST_BASE_URL - Check network connectivity to GrowthBook
- Review timeout settings (
GROWTHBOOK_REQUESTS_TIMEOUT)
Cache issues
- Ensure that you have a caching backend, such as Redis, configured
Webhook not working
- Verify webhook URL is accessible
- Check
GROWTHBOOK_WEBHOOK_SECRETmatches GrowthBook configuration - Review webhook event selection in GrowthBook
| Variable | Required | Default | Description |
|---|---|---|---|
GROWTHBOOK_CLIENT_KEY |
Yes | - | Client key for GrowthBook SDK connection |
GROWTHBOOK_HOST_BASE_URL |
Yes | - | Base URL of your GrowthBook instance |
GROWTHBOOK_REQUESTS_TIMEOUT |
No | 60 | Timeout in seconds for GrowthBook API requests |
GROWTHBOOK_WEBHOOK_SECRET |
No | - | Secret key for webhook authentication |
CACHE_KEY_PREFIX |
No | weni_feature_flags | Prefix for cache keys |
FEATURES_CACHE_TTL |
No | 60 | Cache TTL in seconds for feature flags |
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.