【问题标题】:Can you display python web code in Joomla?你能在 Joomla 中显示 python 网页代码吗?
【发布时间】:2014-03-19 16:32:19
【问题描述】:

我正在构建一个 Joomla 3 网站,但我需要自定义很多页面。我知道我可以将 PHP 与 Joomla 一起使用,但它也可以与 Python 一起使用吗?具体来说,我希望使用 CherryPy 编写一些自定义代码,但我希望它们显示在本机 Joomla 页面(不仅仅是 iFrames)中。这可能吗?

【问题讨论】:

  • 您已经拥有 Joomla 网站了吗?如果你不喜欢 PHP 而喜欢 Python(我不怪你),为什么不使用 Python 编写的 CMS?

标签: php python joomla cherrypy joomla3.0


【解决方案1】:

Python“脚本”的PHP执行

这适用于执行工作并返回输出的脚本,不适用于 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 访问 Pyhton/CherryPy 服务的网站

另一种解决方案是,不使用 PHP 来获取内容,而是从客户端进行获取。基本上,您将使用 Ajax-Request 到 CherryPy 服务的网站,以获取其内容并将其嵌入到 Joomla 服务页面的 dom 中。

 // 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);
    }
 });

【讨论】:

    【解决方案2】:

    从不同来源(Joomla 和 CherryPy)构建页面的最有效方法可能是使用 Edge Side Includes

    基本上,您运行一个为包含 ESI 标记的文档提供服务的 Joomla 实例。您运行一个 CherryPy 实例,该实例为您想要放置在 esi 标签位置上的片段提供服务。然后你运行一个支持 ESI 的反向代理,比如 varnish 将它们拼接在一起。

    这可能看起来像很多活动部件,但它会像......真正响应的东西。调整缓存部分,您的 Joomla 和数据库就可以从大量工作中解脱出来。

    其他答案中的exec 方式适用于打印某些内容的小型python 脚本,但适用于CherryPy。

    【讨论】:

    【解决方案3】:

    您可以通过 php 文件执行它。试试这个:

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

    【讨论】:

    • 哦,很有趣。这是否也适用于输出到像 CherryPy 这样的 web 框架的 python 脚本?或者我将如何让 Python 脚本输出 Web 项目?
    • @JimBeam 这将适用于打印输出和退出的进程。正如您所怀疑的,CherryPy 是一个长期运行的进程,不会打印您的网络内容。
    【解决方案4】:

    有可能,但效率不高。

    您可以使用 exec() 函数从 PHP 执行 Python 脚本: PHP代码:

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

    还有多种类似的PHP函数可以用来 完成相同的事情,但输入方式和 处理输出(passthru、system、proc_open、反引号)。

    Python 脚本将使用其命令行界面执行 - 不使用 CGI(或类似的)界面,如果您使用 Web 服务器直接执行 Python 脚本。这意味着 Python 脚本将无法访问有关 HTTP 的信息 请求 - GET/POST 值、客户端的 IP 地址、页面 URL 等。 您可以使用命令行将此信息从 PHP 传递到 Python 参数、管道、临时文件或其他形式的 进程间通信,但需要传递每一块 明确要求的信息。

    这是低效的原因是因为每次调用 exec 都会 为 Python 脚本生成一个全新的进程。这是一个相当 对每个 HTTP 请求执行昂贵的操作(这就是为什么服务器 像 Apache 和 Fast-CGI 等接口重用子进程和 线程而不是创建新线程)。此外,如果您有更多 比一次调用 exec,每一个都会产生一个新的 过程。

    here 中提取。

    更多信息:Unable to put Python code to Joomla

    【讨论】:

    • "Unable to put Python code to Joomla" 似乎更多是关于将 Python webapp 移植到 Joomla。
    【解决方案5】:

    在考虑 Python 之前

    • 您要自定义什么? (也许一些聪明的 Javascript 或 Joomla 扩展已经存在)

    • 考虑到您使用的是 Joomla,Joomla 方式不是更好的解决您的问题的方法吗? (更改模板,尤其是模块和组件的视图模板)

      i.o.w.:你了解 Joomla 足够 知道你需要别的东西吗?见下文:

    如果 Python 仍然是要走的路:

    • 您的主机是否支持 Python?

    • 您是否应该重新考虑您对 CMS 的选择?

    我喜欢你选择 CherryPy。

    【讨论】:

      猜你喜欢
      • 2019-12-22
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      相关资源
      最近更新 更多