Weni's feature flags SDK for Python backends
Project description
Weni Feature Flags
Weni feature flags SDK for Python backends
What is it
Weni Feature Flags is a Python Library that functions as an abstraction layer between Django projects and GrowthBook.
Requirements
- 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.
Installation
To install it, you can use both pip or Poetry.
Using PIP
pip install weni-feature-flags
Using Poetry
poetry add weni-feature-flags
Initial configuration
On 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 migrate
This library saves a snapshot of the feature flags on your database and cache layer to be resilient to eventual GrowthBook unavailability.
Quick Start
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", "user@example.com", "project-uuid"):
# Show new dashboard
pass
SDK Connection
On 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.
Webhooks
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.
Usage
Using the Service Class
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": "user@example.com",
"projectUUID": "8065619a-2b22-4351-9914-e37c6394b1d3"
})
# Evaluate a specific feature flag by attributes
is_active = service.evaluate_feature_flag_by_attributes(
"feature-key",
{
"userEmail": "user@example.com",
"projectUUID": "8065619a-2b22-4351-9914-e37c6394b1d3"
}
)
Using Shortcuts
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_attributes
Using Shortcuts
If 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", "user@email.com", "8065619a-2b22-4351-9914-e37c6394b1d3"):
# Something cool happens
Or, 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": "user@email.com"}):
pass
# Or any other rule that you have defined on GrowthBook
if is_feature_active_for_attributes("featureKey", {"example": "test"}):
pass
Technical Details
Database Models
This library creates the following database models:
- FeatureFlag: Stores feature flag definitions and their current state
- FeatureFlagSnapshot: Maintains historical snapshots of feature flags for resilience
Caching Strategy
- 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
Troubleshooting
Common Issues
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
All environment variables
| 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 |
License
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file weni_feature_flags-2.0.0a0.tar.gz.
File metadata
- Download URL: weni_feature_flags-2.0.0a0.tar.gz
- Upload date:
- Size: 23.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.5 CPython/3.8.18 Linux/6.11.0-1018-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a79e012b10ce14539a5e789d6e835d72c4d6284d866c87dce2cc921ec1ae8abd
|
|
| MD5 |
a12e4ee0e49341b55fd8b9a72eb9d388
|
|
| BLAKE2b-256 |
b60857adb3b0d4b23938274a4c87560ffb80bd064afa60500b6ca8f512404a0c
|
File details
Details for the file weni_feature_flags-2.0.0a0-py3-none-any.whl.
File metadata
- Download URL: weni_feature_flags-2.0.0a0-py3-none-any.whl
- Upload date:
- Size: 28.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.5 CPython/3.8.18 Linux/6.11.0-1018-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bc12a7f5845cbad9d5ed0d533b288723021d90852c72c08fff8230e608c320dc
|
|
| MD5 |
493d07ae60537be4a8327f7eb0d24a25
|
|
| BLAKE2b-256 |
280518502f003b035931cf7a9ce2e271e2ecd10e3980a03e2f47d7dd9d48c0ea
|