--- title: Django author: Steve Kossouho --- # Éléments avancés ---- ## Envoyer des emails Django propose de nombreuses façons d'envoyer des emails, mais la plus simple d'entre elles consiste à utiliser une fonction utilitaire nommée `send_mail` et configurer si nécessaire vos paramètres pour l'envoi de mail. La procédure est décrite dans la [documentation officielle](https://docs.djangoproject.com/en/dev/topics/email/). ---- ![Envoi d'un email en deux lignes](assets/images/advanced-send-mail.png) *(voir, dans le projet `advanced`, l'exemple dans le notebook Jupyter.)* ---- ## Créer des vues de téléchargement Pour proposer un fichier au téléchargement dans une vue, il faut renvoyer un objet `HttpResponse` dont le contenu est le fichier cible, et y ajouter les en-têtes HTTP nécessaires au navigateur. ---- ![Fichier à télécharger via Django](assets/images/advanced-file-download.png) ---- ## Lancement de tests d'un projet Django (unittest) En Python comme dans d'autres langages, il existe des frameworks pour effectuer des tests unitaires, d'intégration, et même des tests de bout-en-bout. En Java, le framework le plus connu est JUnit, et Python s'en est directement inspiré pour créer `unittest`, disponible par défaut. ---- Pour effectuer des tests, Django utilise par défaut `unittest`. Ainsi, l'écriture de tests unitaires est identique à dans n'importe quel autre projet Python : - On écrit, dans un module de `tests`, des classes héritant de `TestCase`. - Ces classes peuvent redéfinir `setUp()`, `tearDown()`, et `setUpClass` et `tearDownClass` pour configurer des "fixtures". - Les tests unitaires sont écrits dans des méthodes dont le nom débute par `test_`. Pour démarrer les tests, il suffit ensuite de lancer `./manage.py test`. ---- ## Lancement de tests (test client) Lors des tests, on peut souhaiter vouloir tester la génération des pages de notre site (end-to-end), en, par exemple, testant qu'une URL ne renvoie pas de 404 ou que son contenu est attendu. Pour ce faire, Django propose un "client" de tests, décrit dans `django.test.Client`. ---- Son utilisation est simple : ![Utilisation du client de test Django](assets/images/advanced-test-client.png) ---- ## Déploiement d'un projet Django En production, on ne sert jamais une application Django en utilisant `runserver`. En général, on utilise une pile logicielle du type suivant : - Apache/Nginx servant sur le port 80 - Serveur WSGI du type Gunicorn, qui sert l'application via un socket Unix ou un socket TCP en écoute sur localhost uniquement - Nginx sert les ressources (statiques et média) publiques - Nginx passe les autres demandes d'URLs au serveur WSGI Voici un [tutorial pour configurer la pile Nginx/Gunicorn](https://python.developpez.com/actu/94911/Mise-en-production-d-un-site-Django-en-utilisant-Nginx-et-Gunicorn/) ---- ## Interconnexion avec les réseaux sociaux En plus de l'authntification, vous pouvez lier des utilisateurs à des données de connexion relatives à des réseaux sociaux divers. L'application externe `django-allauth` propose une [documentation en ligne](https://django-allauth.readthedocs.io/en/latest/overview.html), et est l'application la plus maintenue pour gérer la connexion via de très nombreux réseaux sociaux ou services OAuth. ---- ## Divers : Procédure de tests Pour aller plus loin, vous pouvez utiliser le paquet externe `pytest` à la place de `unittest`, aussi bien pour vos projets Python que Django. Si l'outil est simple à mettre en place pour Python, préférez l'assembler avec [Pytest-Django](https://pytest-django.readthedocs.io/en/latest/). *Portez attention au chapitre sur les bases de données de test avec pytest-django*