Skip to content

weni-ai/weni-feature-flags

Repository files navigation

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:

  1. Install the package:
pip install weni-feature-flags
  1. 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"
  1. Run migrations:
python manage.py migrate
  1. 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
    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": "[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"
    }
)

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", "[email protected]", "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": "[email protected]"}):
    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_KEY and GROWTHBOOK_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_SECRET matches 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.

About

Weni feature flags SDK for Python backends

Resources

License

Contributing

Stars

Watchers

Forks

Packages

No packages published

Languages