HOWTO · Python
Python in HTML ausführen
Erfahren Sie, wie Sie Python in HTML ausführen
Auf dieser Seite
Ein Browser führt serverseitiges Python nicht aus, nur weil ein Skript in statischem HTML steht. Damit Python-generierte Inhalte angezeigt werden, muss Python auf einem Server laufen, der seine Ausgabe in der HTTP-Antwort zurückgibt. Eine PHP-Anwendung kann für eine kleine Integration einen Python-Prozess starten; eine Django-Anwendung übergibt Daten normalerweise aus einer View an ein Template.
Python-Skripte in HTML mit PHP ausführen
Speichere die Seite mit einer von PHP verarbeiteten Dateiendung wie .php und stelle sie über einen entsprechend konfigurierten PHP-Server bereit. Auf dem Server müssen außerdem ein Python-Interpreter und die Berechtigung zum Starten des Interpreters vorhanden sein. Dieses eigenständige Beispiel erstellt ein kurzes Python-Skript, übergibt ihm sicher zwei Argumente und fügt das abgefangene Ergebnis in die Antwort ein:
<?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>
Hier startet PHP python3; der Python-Prozess erhält Mina und 3 als sys.argv[1] und sys.argv[2]. shell_exec() fängt die Prozessausgabe ab, und htmlspecialchars() kodiert sie, bevor sie in die Seite eingefügt wird. Es handelt sich um Antwortinhalt, der an den Browser gesendet wird, nicht um Text, der auf der Serverkonsole ausgegeben wird.
Der PHP-Host muss shell_exec() aktiviert haben, und das Webserver-Konto muss den Interpreter ausführen dürfen. Das Beispiel verwendet feste Argumente. Bei dynamischen Werten solltest du diese validieren und jedes Argument einzeln mit escapeshellarg() maskieren. Verknüpfe niemals nicht vertrauenswürdige Eingaben zu einem Shell-Befehl. Für eine größere Anwendung können eine Job-Warteschlange oder ein eigener Dienst besser geeignet sein, als bei jeder Anfrage einen Prozess zu starten.
Python-Skripte in HTML mit Django ausführen
Lege die Anwendungslogik in einer Django-Anwendung in Python-Views ab und übergib das Ergebnis an ein Template. Das Template rendert den Wert auf dem Server zu HTML; der Browser erhält die gerenderte Seite und führt kein Python aus. Eine View kann zum Beispiel context = {"message": "Hello from Django"} vorbereiten und render(request, "page.html", context) zurückgeben, während das Template den Wert mit {{ message }} anzeigt.
Ein eigenes Template-Tag ist nützlich, wenn wiederverwendbare Darstellungslogik in Templates gehört. Erstelle in einer installierten App namens core die Dateien core/templatetags/__init__.py und core/templatetags/my_custom_tags.py. Importiere in der zweiten Datei template aus django, setze register = template.Library() und definiere eine mit @register.simple_tag dekorierte Funktion, zum Beispiel def greeting(): return "Hello from Django". Starte den Entwicklungsserver neu, nachdem du das Paket templatetags hinzugefügt hast, damit Django es erkennt.
Lade das Modul in einem Template mit {% load my_custom_tags %} und rufe das Tag mit {% greeting %} auf. Das Tag liefert Text für das serverseitige Rendern des Templates zurück; es führt kein beliebiges Python in Browser-HTML aus. Für einfache Werte sind eine View und ein Template-Kontext meist verständlicher als ein eigenes Tag. Django stellt außerdem eingebaute Filter wie date, linebreaks, safe und random bereit. Weitere Informationen findest du in der Referenz zu den eingebauten Django-Template-Filtern.
Wenn eine Seite nach dem Laden Daten benötigt, kannst du eine Django-View als Endpunkt bereitstellen und sie mit fetch() oder einem anderen AJAX-Client aufrufen. Prüfe die Authentifizierung und Autorisierung, bevor du vertrauliche Daten zurückgibst oder eine Aktion ausführst. Verwende bei zustandsändernden POST-Anfragen den CSRF-Schutz von Django und sende das CSRF-Token mit. Einen Endpunkt nur auf POST zu beschränken, macht ihn nicht sicher. Weitere Informationen findest du in der Django-Dokumentation zu CSRF.
Starte einen Python-Prozess über PHP, wenn du ein kleines bestehendes Python-Skript in eine PHP-gehostete Website integrierst und der Host dies zulässt. In einer Django-Anwendung sind Views und Templates der übliche Weg, Seitendaten zu berechnen und darzustellen. Verwende ein eigenes Tag für wiederverwendbare Darstellung im Template und einen Endpunkt für Daten, die erst nach dem Laden der Seite angefordert werden.