Skip to main content

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:

  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", "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_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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

weni_feature_flags-2.0.0a0.tar.gz (23.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

weni_feature_flags-2.0.0a0-py3-none-any.whl (28.3 kB view details)

Uploaded Python 3

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

Hashes for weni_feature_flags-2.0.0a0.tar.gz
Algorithm Hash digest
SHA256 a79e012b10ce14539a5e789d6e835d72c4d6284d866c87dce2cc921ec1ae8abd
MD5 a12e4ee0e49341b55fd8b9a72eb9d388
BLAKE2b-256 b60857adb3b0d4b23938274a4c87560ffb80bd064afa60500b6ca8f512404a0c

See more details on using hashes here.

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

Hashes for weni_feature_flags-2.0.0a0-py3-none-any.whl
Algorithm Hash digest
SHA256 bc12a7f5845cbad9d5ed0d533b288723021d90852c72c08fff8230e608c320dc
MD5 493d07ae60537be4a8327f7eb0d24a25
BLAKE2b-256 280518502f003b035931cf7a9ce2e271e2ecd10e3980a03e2f47d7dd9d48c0ea

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page