HOWTO · Python
Exécuter Python en HTML
Apprenez à exécuter Python en HTML
Sur cette page
Un navigateur n’exécute pas du Python côté serveur simplement parce qu’un script est placé dans du HTML statique. Pour afficher du contenu généré par Python, exécutez Python sur un serveur et renvoyez son résultat dans la réponse HTTP. Une application PHP peut lancer un processus Python pour une petite intégration ; une application Django transmet généralement les données d’une vue à un template.
Exécuter des scripts Python dans une page HTML avec PHP
Enregistrez la page avec une extension traitée par PHP, comme .php, puis servez-la depuis un serveur PHP configuré. Le serveur doit aussi disposer d’un interpréteur Python et avoir l’autorisation de le lancer. Cet exemple autonome crée un court script Python, lui transmet deux arguments de manière sûre et place le résultat capturé dans la réponse :
<?php
$pythonScript = <<<'PY'
import sys
name = sys.argv[1]
count = int(sys.argv[2])
print(f"Hello, {name}! Count: {count}")
PY;
$scriptPath = tempnam(sys_get_temp_dir(), 'page-python-');
file_put_contents($scriptPath, $pythonScript);
$command = 'python3 ' . escapeshellarg($scriptPath)
. ' ' . escapeshellarg('Mina')
. ' ' . escapeshellarg('3');
$result = shell_exec($command);
unlink($scriptPath);
?><!doctype html>
<html lang="en">
<body>
<p><?= htmlspecialchars($result ?? '', ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ?></p>
</body>
</html>
Ici, PHP lance python3 ; le processus Python reçoit Mina et 3 dans sys.argv[1] et sys.argv[2]. shell_exec() capture la sortie du processus, et htmlspecialchars() l’encode avant son insertion dans la page. Il s’agit du contenu de la réponse envoyé au navigateur, et non d’un texte affiché dans la console du serveur.
L’hôte PHP doit autoriser shell_exec(), et le compte du serveur Web doit pouvoir exécuter l’interpréteur. L’exemple utilise des arguments fixes. Pour des valeurs dynamiques, validez-les et échappez chaque argument séparément avec escapeshellarg() ; ne concaténez jamais des données non fiables dans une commande shell. Pour une application plus importante, une file de tâches ou un service dédié peut être préférable au lancement d’un processus à chaque requête.
Exécuter un script Python dans une page HTML avec Django
Dans une application Django, placez la logique applicative dans des vues Python et transmettez son résultat à un template. Le template rend cette valeur en HTML sur le serveur ; le navigateur reçoit la page rendue et n’exécute pas Python. Par exemple, une vue peut préparer context = {"message": "Hello from Django"} et renvoyer render(request, "page.html", context), tandis que le template l’affiche avec {{ message }}.
Un tag de template personnalisé est utile lorsque des éléments de présentation réutilisables doivent se trouver dans les templates. Dans une application installée nommée core, créez core/templatetags/__init__.py et core/templatetags/my_custom_tags.py. Dans ce dernier fichier, importez template depuis django, définissez register = template.Library(), puis créez une fonction décorée avec @register.simple_tag, par exemple def greeting(): return "Hello from Django". Redémarrez le serveur de développement après avoir ajouté le paquet templatetags afin que Django le détecte.
Dans un template, chargez le module avec {% load my_custom_tags %} et appelez le tag avec {% greeting %}. Le tag renvoie du texte destiné au rendu du template côté serveur ; il n’exécute pas du Python arbitraire dans le HTML du navigateur. Pour des valeurs simples, une vue et son contexte de template sont généralement plus clairs qu’un tag personnalisé. Django fournit également des filtres intégrés tels que date, linebreaks, safe et random ; consultez la référence des filtres de template intégrés de Django.
Si la page a besoin de données après son chargement, exposez une vue Django sous forme de point de terminaison et appelez-la avec fetch() ou un autre client AJAX. Vérifiez l’authentification et les autorisations avant de renvoyer des données sensibles ou d’effectuer une action. Pour les requêtes POST qui modifient l’état, utilisez la protection CSRF de Django et transmettez le jeton CSRF. Limiter un point de terminaison aux requêtes POST ne suffit pas à le sécuriser. Consultez la documentation Django sur CSRF.
Choisissez l’invocation d’un processus PHP pour intégrer un petit script Python existant à un site hébergé sur PHP, si l’hébergeur l’autorise. Dans une application Django, les vues et les templates sont la manière habituelle de calculer et d’afficher les données d’une page ; utilisez un tag personnalisé pour une présentation réutilisable dans les templates et un point de terminaison pour les données demandées après le chargement de la page.