可以在Joomla中展示Python网页代码吗?

5 投票
5 回答
6745 浏览
提问于 2025-04-17 22:59

我正在搭建一个Joomla 3的网站,但我需要对很多页面进行一些自定义。我知道可以在Joomla中使用PHP,但我想问问,能不能用Python呢?具体来说,我想用CherryPy来写一些自定义的代码,但我希望这些代码能直接显示在Joomla的页面上,而不是仅仅放在iFrame里。这样做可以吗?

5 个回答

0

在考虑使用Python之前

  • 你想要自定义什么呢?(也许已经有一些聪明的Javascript或者Joomla的扩展可以满足你的需求)

  • 既然你在用Joomla,是否有更好的解决方案呢?(比如换个模板,或者特别修改模块和组件的视图模板)

    换句话说:你对Joomla了解得够多吗?知道自己需要其他东西吗?下面会有更多信息:

如果还是决定使用Python:

  • 你的主机支持Python吗?

  • 你是否应该重新考虑一下选择的内容管理系统(CMS)?

我喜欢你选择的CherryPy。

0

这是可以做到的,但效率不是很高。

你可以通过 PHP 的 exec() 函数来执行一个 Python 脚本:

exec("python /path/to/python-script.py");

还有一些类似的 PHP 函数可以用来完成同样的事情,它们在处理输入和输出的方式上有一些小的不同(比如 passthru、system、proc_open 和反引号)。

这个 Python 脚本会通过命令行界面来执行,而不是通过 CGI(或类似的)接口,就像如果网络服务器直接执行 Python 脚本那样。这意味着 Python 脚本无法获取关于 HTTP 请求的信息,比如 GET/POST 的值、客户端的 IP 地址、页面的 URL 等等。你可以通过命令行参数、管道、临时文件或其他进程间通信的方式把这些信息从 PHP 传递给 Python,但你需要明确地传递每一条所需的信息。

之所以效率低,是因为每次调用 exec 都会为 Python 脚本创建一个全新的进程。每次 HTTP 请求都进行这样的操作是比较耗费资源的(这就是为什么像 Apache 这样的服务器和 Fast-CGI 这样的接口会重用子进程和线程,而不是每次都创建新的)。而且,如果你有多个 exec 的调用,每一个都会生成一个新的进程。

摘自 这里

更多信息:无法将 Python 代码放入 Joomla

0

你可以通过一个php文件来执行它。试试这个:

exec("python/path/your-script.py");  
1

构建来自不同来源(比如Joomla和CherryPy)的页面,最有效的方法可能就是使用边缘侧包含(Edge Side Includes,简称ESI)。

简单来说,你需要运行一个Joomla实例,它负责提供包含ESI标签的文档。同时,你还需要运行一个CherryPy实例,它负责提供你想放在ESI标签位置的内容。最后,你需要一个支持ESI的反向代理,比如Varnish,来把这些内容整合在一起。

虽然看起来有很多部分在运作,但它的响应速度会非常快,就像某种非常灵敏的东西一样。调整缓存的设置,可以减轻Joomla和数据库的负担,让它们工作得更轻松。

其他答案提到的exec方法适合小的Python脚本,用来打印一些东西,但对于CherryPy来说,这种方法是不适用的。

1

PHP执行Python“脚本”

这个方法适用于那些能执行任务并返回结果的脚本,不适用于CherryPy。

 <?php
    // execute your Python script from PHP
    $command = escapeshellcmd('myPythonScript.py');
    $output = shell_exec($command);

    echo $output;

    // take response content to embed it into the page
 ?>

PHP访问Python/CherryPy提供的网站

import cherrypy
class HelloWorld(object):
    def index(self):
        return "Hello World!"
    index.exposed = True

cherrypy.quickstart(HelloWorld())

这会启动一个 http://localhost:8080 的服务,你应该能看到 Hello world!

现在你可以通过访问 localhost:port 来获取CherryPy的输出。虽然性能不是很好,但可以正常工作。

<?php
    $output = file_get_contents('http://localhost:8080/');
    echo $output;
?>

Joomla + Ajax访问Python/CherryPy提供的网站

另一种解决方案是,不通过PHP来获取内容,而是从客户端直接获取。基本上,你会使用Ajax请求去访问CherryPy提供的网站,获取它的内容并把它嵌入到Joomla提供的页面中。

 // add jQuery Ajax reqeust from your Joomla page to CherryPy
 $.ajax({
    url: "https://localhost:8080/", // <-- access the 2nd served website
    type: 'GET',
    success: function(res) {
      //console.log(res);
      alert(res);
      $("#someElement").html(res);
    }
 });

撰写回答