ACE - Automated Communication Engine
raw JSON → 1.15.0 verified Mon Apr 27 auth: no python
A Django based framework for sending messages (email, push, etc.) as part of the Open edX platform. Version 1.15.0 released April 2025. Dropped Python 3.8 support in v1.13.0 and added Django 5.2 support. Maintained by edX team.
pip install edx-ace Common errors
error ImportError: cannot import name 'BrazePushChannel' from 'edx_ace.channel' ↓
cause Braze push channel was removed in v1.15.0 and moved to edx-braze-client.
fix
Install edx-braze-client and import from there: from edx_braze_client.channel import BrazePushChannel
error TypeError: __init__() missing 4 required positional arguments: 'app_name', 'name', 'language', and 'recipient' ↓
cause Missing required arguments when creating a Message instance.
fix
Provide all required fields: Message(app_name='...', name='...', language='en', recipient=Recipient(...))
Warnings
breaking v1.15.0: Braze push channel moved to edx-braze-client. If you rely on the BrazePushChannel, you must install edx-braze-client separately. ↓
fix Add edx-braze-client to your requirements and update imports from edx_ace.channel.braze_push to edx_braze_client.
breaking v1.13.0: Python 3.8 support dropped. Django 5.2 added. Ensure your environment uses Python >=3.9. ↓
fix Upgrade to Python 3.9+ and update Django to 5.2 if using that version.
gotcha Do not instantiate Message without the required app_name, name, language, and recipient fields. Missing fields will cause silent failures or AttributeErrors at send time. ↓
fix Always provide all required arguments to Message(). At minimum: app_name, name, language, and recipient.
Imports
- send_ace_message
from edx_ace import send_ace_message - ace
import edx_ace.ace as ace - Message
from edx_ace.message import Message - Recipient
from edx_ace.recipient import Recipient
Quickstart
from edx_ace import send_ace_message
from edx_ace.message import Message
from edx_ace.recipient import Recipient
msg = Message(
app_name='myapp',
name='welcome_email',
language='en',
recipient=Recipient(username='learner', email='learner@example.com')
)
# Add context data as needed
msg.context.update({'name': 'John'})
send_ace_message(msg)