HOWTO · Python
在 HTML 中运行 Python
了解如何在 HTML 中运行 Python
本页内容
浏览器不会因为静态 HTML 中放入了脚本就执行服务器端的 Python。若要显示由 Python 生成的内容,需要在服务器上运行 Python,并将输出放入 HTTP 响应中返回。对于小型集成,PHP 应用可以启动 Python 进程;Django 应用通常会将视图中的数据传给模板。
使用 PHP 在 HTML 中运行 Python 脚本
将页面保存为由 PHP 处理的扩展名,例如 .php,并通过已配置好的 PHP 服务器提供页面。服务器还需要安装 Python 解释器,并允许启动该解释器。下面的独立示例会创建一个简短的 Python 脚本、安全地传入两个参数,并将捕获的结果放入响应中:
<?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>
这里由 PHP 启动 python3;Python 进程分别通过 sys.argv[1] 和 sys.argv[2] 接收 Mina 与 3。shell_exec() 会捕获进程输出,htmlspecialchars() 则会在将输出插入页面前对其进行编码。这些内容会作为响应发送给浏览器,而不是打印到服务器控制台。
PHP 主机必须启用 shell_exec(),并且 Web 服务器账户必须有权限运行解释器。示例使用固定参数。若要传入动态值,请先验证这些值,再用 escapeshellarg() 分别转义每个参数;切勿将不可信输入直接拼接到 shell 命令中。对于规模较大的应用,与其为每个请求启动一个进程,使用任务队列或专用服务可能更合适。
使用 Django 在 HTML 中运行 Python 脚本
在 Django 应用中,将应用逻辑放在 Python 视图里,并把结果传给模板。模板会在服务器上将该值渲染为 HTML;浏览器收到的是渲染后的页面,不会执行 Python。例如,视图可以准备 context = {"message": "Hello from Django"},并返回 render(request, "page.html", context);模板则通过 {{ message }} 显示该值。
如果需要在模板中复用展示逻辑,可以使用自定义模板标签。假设已安装名为 core 的应用,请创建 core/templatetags/__init__.py 和 core/templatetags/my_custom_tags.py。在后一个文件中,从 django 导入 template,设置 register = template.Library(),并定义一个用 @register.simple_tag 装饰的函数,例如 def greeting(): return "Hello from Django"。添加 templatetags 包后,请重启开发服务器,让 Django 发现它。
在模板中,使用 {% load my_custom_tags %} 加载模块,再用 {% greeting %} 调用标签。该标签会返回供服务器端模板渲染使用的文本;它不会在浏览器的 HTML 中运行任意 Python。对于简单的值,通常直接使用视图和模板上下文会比自定义标签更清晰。Django 还提供 date、linebreaks、safe 和 random 等内置过滤器,详情请参阅 Django 内置模板过滤器参考。
如果页面加载后还需要获取数据,可以将 Django 视图公开为端点,再通过 fetch() 或其他 AJAX 客户端请求该端点。在返回敏感数据或执行操作前,请检查用户的身份验证和授权状态。对于会改变状态的 POST 请求,应启用 Django 的 CSRF 防护并发送 CSRF 令牌。仅限制端点使用 POST 并不能保证安全。详情请参阅 Django CSRF 文档。
如果要将一个小型现有 Python 脚本集成到 PHP 托管的网站中,并且主机允许启动该脚本,可选择由 PHP 启动 Python 进程。在 Django 应用中,通常使用视图和模板来计算并渲染页面数据;需要复用模板展示逻辑时使用自定义标签,需要在页面加载后获取数据时使用端点。