Diffuser des messages texte à partir d'applications Web Django en Python 3

October 26, 2019
Rédigé par
Matt Makai
Twilion

Comment diffuser des messages texte à partir d'applications Web Django en Python 3

Les messages texte (Short Message Service, SMS ou service de messages courts) sont utilisés partout pour faciliter les communications urgentes. Il est également facile d'en envoyer à grande échelle en combinant une application Web Django avec une interface de programmation d'application (API).

Dans ce tutoriel, nous allons créer un projet Django simple, dans lequel nous allons mettre en place une fonctionnalité SMS permettant de transmettre des messages à plusieurs destinataires.

Si vous souhaitez aller plus loin dans l'apprentissage de Python ou de l'API Twilio SMS, découvrez l'incroyable jeu TwilioQuest pour vous entraîner.

Dépendances de projet requises

Nous utiliserons Python 3 dans le cadre de ce tutoriel, car Python 2 n'est plus pris en charge depuis le 31 décembre 2019. Plus précisément, nous allons ici utiliser Python 3.8.

Nous aurons également besoin des dépendances d'application suivantes‌ dans notre appli :

Si vous avez besoin d'aide pour configurer votre environnement de développement avant d'exécuter ce code, consultez ce guide de configuration pour Python 3 et Django sur Ubuntu 16.04 LTS.

Le code utilisé dans ce post est également disponible sur GitHub dans le répertoire django/djsms du répertoire Git python-twilio-example-apps.

Installation des dépendances de projet Python

Notre code utilise la librairie de Twilio pour faciliter l'envoi de messages texte avec Python. Nous allons installer la librairie depuis PyPI dans un environnement virtuel.

Mais tout d'abord, nous devons créer l'environnement virtuel. Dans votre terminal, saisissez la commande suivante pour créer un nouvel environnement virtuel et l'activer :

python3 -m venv smspy3
source smspy3/bin/activate

Installez Django et la librairie de Twilio :

pip install django==2.2.6 twilio==6.32.0

Une fois la commande terminée, un résultat ressemblant aux lignes suivantes devrait s'afficher :

Successfully installed django-2.2.6 pytz-2019.3 sqlparse-0.3.0
PyJWT-1.7.1 certifi-2019.9.11 chardet-3.0.4 idna-2.8 requests-2.22.0 six-1.12.0 twilio-6.32.0 urllib3-1.25.6

À ce stade, nous avons installé les dépendances nécessaires et pouvons désormais les utiliser pour créer notre projet.

Création du projet Django

Nous allons commencer notre projet en utilisant l'outil django-admin de Django pour créer une structure de code standard.

Accédez au répertoire dans lequel vous développez vos applications. En ce qui me concerne, j'utilise généralement le répertoire /Users/matt/devel/py/ sur mon Mac ou /home/matt/devel/py sur Linux.

Exécutez la commande suivante pour démarrer un projet Django nommé djsms et accéder au répertoire que vous venez de créer :

django-admin startproject djsms
cd djsms

Créez une nouvelle application Django nommée broadcast dans le projet djsms :

python manage.py startapp broadcast

Django génère un nouveau dossier nommé broadcast une fois la commande exécutée, Nous devons mettre à jour les fichiers de paramètres et d'URL du projet. Assurez-vous donc que l'application broadcast est disponible.

Ouvrez djsms/settings.py :

ALLOWED_HOSTS = []


TWILIO_ACCOUNT_SID = os.getenv("TWILIO_ACCOUNT_SID")
TWILIO_AUTH_TOKEN = os.getenv("TWILIO_AUTH_TOKEN")
TWILIO_NUMBER = os.getenv("TWILIO_NUMBER")
SMS_BROADCAST_TO_NUMBERS = [ 
    "", # use the format +19735551234
    "", 
    "", 
]


# Application definition

INSTALLED_APPS = [ 
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'broadcast',
]

Assurez-vous de modifier les valeurs par défaut DEBUG et SECRET_KEY dans settings.py avant d'archiver vos fichiers dans Git ou de déployer du code en production. Sécurisez votre application correctement à l'aide des informations de la checklist du déploiement de production ‌de Django afin de ne pas ajouter votre projet à la liste des applications piratées sur le Web.

Enregistrez et fermez settings.py. Ouvrez le fichier djsms/urls.py et ajoutez les URL de l'application broadcast à la liste des URL de votre projet principal :

from django.conf.urls import include
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('', include('broadcast.urls')),                                                                                                                                                 
    path('admin/', admin.site.urls),
]

Les deux nouvelles lignes de code ci-dessus relient le fichier urls.py principal au fichier broadcast/urls.py, que nous allons ensuite compléter.

Coder l'application de diffusion

Accédez ensuite au répertoire broadcast. Créez un nouveau fichier nommé urls.py dont on se servira pour indiquer un chemin URL dédié à l'envoi des SMS :

cd broadcast
touch urls.py

Ouvrez le fichier urls.py vide et ajoutez les lignes de code suivantes :

from django.conf.urls import url                                                                                                                                                         
from . import views

urlpatterns = [ 
    url(r'broadcast$', views.broadcast_sms, name="default"),
]

Dans le code ci-dessus, il y a une route URL unique correspondant à `broadcast`,qui joue le rôle de chemin d'accès à la fonction d'affichage `broadcast_sms` qu'il nous reste à coder
Nous devons écrire cette fonction dans `broadcast/views.py` pour gérer l'envoi des messages. Enregistrez le fichier `urls.py` et ouvrez `views.py`, puis mettez-le à jour à l'aide des lignes suivantes :

from django.conf import settings                                                                                                                                                      
from django.http import HttpResponse
from twilio.rest import Client


def broadcast_sms(request):
    message_to_broadcast = ("Have you played the incredible TwilioQuest "
                                                "yet? Grab it here: https://www.twilio.com/quest")
    client = Client(settings.TWILIO_ACCOUNT_SID, settings.TWILIO_AUTH_TOKEN)
    for recipient in settings.SMS_BROADCAST_TO_NUMBERS:
        if recipient:
            client.messages.create(to=recipient,
                                   from_=settings.TWILIO_NUMBER,
                                   body=message_to_broadcast)
    return HttpResponse("messages sent!", 200)

Dans le code ci-dessus, nous importons le fichier settings de Django afin de pouvoir accéder aux paramètres de notre projet ainsi qu'à la classe HttpResponse pour renvoyer un simple code de statut HTTP 200  avec une réponse texte. Nous importons également la librairie de Twilio pour Python.

La fonction broadcast_sms gère la majeure partie du travail. Elle spécifie un message à envoyer, instancie le client librairie et lit en boucle chaque numéro de téléphone répertorié dans la variable SMS_BROADCAST_TO_NUMBERS. Si un numéro de téléphone est indiqué (non vide), la fonction appelle l'API de Twilio pour envoyer le SMS au numéro de téléphone du destinataire. Une fois la boucle terminée, la fonction retourne une réponse HTTP 200 avec le texte « messages sent ! » (messages envoyés).

Avant de tester notre application, nous devons obtenir un numéro de téléphone auprès de Twilio ainsi que des informations d'identification pour nous authentifier auprès de l'API.

Accès à l'API Twilio SMS

Connectez-vous à votre compte Twilio ou créez un compte Twilio gratuit.

Une fois le processus d'inscription (ou de connexion) terminé, vous êtes dirigé vers la console Twilio, où vous pourrez accéder à votre Account SID (SID de compte) et Auth Token (token d'authentification), comme indiqué ci-dessous :

Comment obtenir le SID du compte et le jeton d'authentification à partir de la console Twilio

Définissez l'Account SID et Auth Token comme variables d'environnement pour que votre application Django puisse les lire et les utiliser. Créez un nouveau fichier nommé .env et collez le contenu suivant dans ce fichier.

(Vous pouvez également copier le fichier template.env du répertoire Git sous le répertoire django/djsms/ et le renommer en .env.)

# Django SECRET_KEY pour les sessions                                                                                                                              
SECRET_KEY='development key' # changez cette ligne pour une clef secrète lors du déploiement

# identifiants Twilio et numéro de téléphone
TWILIO_ACCOUNT_SID=' ' # obtenu sur twilio.com/console
TWILIO_AUTH_TOKEN=' ' # obtenu également sur twilio.com/console
TWILIO_NUMBER=' ' # utilisez le numéro que vous avez reçu à l'inscription ou achetez un nouveau numéro

Remplacez les variables TWILIO_ACCOUNT_SID et TWILIO_AUTH_TOKEN avec vos informations d'identification obtenues à partir de la console. Vous devez avoir reçu un numéro de téléphone Twilio lors de votre inscription. Vous pouvez également acheter un nouveau numéro de téléphone pour ce tutoriel.

Appelez le fichier .env pour définir les variables suivantes :

source .env

Notez que si vous utilisez Windows, la définition des variables d'environnement est légèrement différente. Consultez ce tutoriel pour obtenir des instructions détaillées.

Maintenant que le code et les informations d'identification sont prêts, essayons de faire fonctionner notre projet.

Test d'une diffusion de SMS

Lancez le serveur de développement Django :

python manage.py runserver

Rendez-vous à l'adresse https://localhost:8000/broadcast dans votre navigateur Web pour démarrer l'envoi des messages. Votre navigateur devrait afficher ceci :

Message « messages sent » (messages envoyés) affiché dans le navigateur

Après un moment, tous les numéros de téléphone répertoriés dans SMS_BROADCAST_TO_NUMBERS recevront un SMS :

Message texte reçu

Parfait, le projet a fonctionné ! Découvrez maintenant ce que TwilioQuest vous réserve pour en savoir plus sur les possibilités de Python et Programmable SMS.

Projet Django de diffusion de SMS : conclusion

Nous venons de créer une application pour envoyer des SMS à plusieurs destinataires à l'aide de Python 3.8 et du framework Web Django.

Vous pouvez maintenant vous baser sur mon code pour développer votre application et stocker des numéros de téléphone dans une base de données avec l'ORM de Django, ou créer une interface utilisateur pour faciliter la personnalisation de vos messages.

Voici quelques autres tutoriels Python intéressants :

J'ai hâte de voir ce que vous allez construire !