【问题标题】:Pass form variables from PHP to Python (inside jumi in Joomla)将表单变量从 PHP 传递到 Python(在 Joomla 中的 jumi 内)
【发布时间】:2013-07-11 15:30:13
【问题描述】:

有没有办法让 PHP 将 HTML 表单变量 (POST) 直接传递给在 PHP 中使用“passthru”调用的 python 脚本,而 PHP 不必知道变量名?

PHP 能否将 HTTP POST 请求传递给 python,即 python 中的cgi 模块将读取它,就像它是“从网络”传递的一样?

基本设置:Joomla CMS,带有 jumi 模块。
注意! RedHat 5.9 上的 Python 2.4、PHP 5.3.3 - 仅限标准包。

其中一个 jumi 应用程序是一个 python 脚本,它创建一个表单,并处理 POST 变量。

原因:本店python知识比较多,python脚本在后台做的很多。

在我的 jumi PHP 脚本中:

<?php
$var1 = $_REQUEST['myVar1'];
$var2 = $_REQUEST['myVar2'];
echo passthru('/usr/bin/python /var/www/html/joomla/jumi/portal-ldap.py '.$myVar1.' '.$myVar2);
?>

python 脚本然后使用sys.arvg 来处理这些变量。

它可以工作 - 无论如何,但这也意味着两个脚本都必须知道任何附加变量。

有没有办法让 PHP 以某种方式将表单变量直接传递给 python 脚本,以便 Python 中的“cgi”模块可以处理变量,就像我使用 framework/cgi/ 运行 python 脚本一样mod_python/...?

Python 处理表单变量:

import cgi
form = cgi.FieldStorage()
var1 = form.getvalue("myVar1", "nothing")
var2 = form.getvalue("myVar2", "nothing")

【问题讨论】:

    标签: php python joomla jumi


    【解决方案1】:

    如果您绝对想通过cgi.FieldStorage 读取值,您可以在HTTP 服务器上运行python 脚本,最好将其访问权限限制为localhost。通过 HTTP 执行调用也比将参数传递给未解析的 passthrough() 更安全很多

    或者,您可以更改您的 python 脚本以使用 getopt 模块,这样可以更轻松地在键值对中定义参数,如下所示(为简洁起见省略了路径):

    python portal-ldap.py --myvar1 nothing --myvar2 nothing
    

    如果您决定继续使用passthgough(),请记住使用escapeshellarg() 转义所有参数。

    编辑:您也可以json_encode($_REQUEST) 并将其作为参数传递,然后在Python 中json.loads() 将其作为字典获取数组。

    【讨论】:

    • 最好将它保存在 Joomla/jumi 中——因此在这种情况下设置 cgi/mod_python 不是问题。也许在另一个项目中......
    • getopt 是我正在考虑的事情之一。由于变量的数量 可以 有所不同,我认为让 PHP 以 Python 可以理解的方式直接传递 $_POST 或 $_REQUEST 标头是一件“好事”(Tm),但我似乎无法理解这是如何实现的。
    • @sastorsl:您可以尝试将请求对象作为 JSON 传递,请参阅我更新的答案。
    • 非常感谢。我最终得到了 json - 我想这也是一个更好的方法,因为如果 python 程序在“网络”之外运行,它现在也更可重用。
    【解决方案2】:

    我会回答我自己的问题来解释我是如何使用我得到的信息的。

    我还必须补充一点,我受限于使用 python 2.4 和(可能不限于)simplejson - 因为我在这个项目中使用的是 RedHat 5.9 - 并且希望/需要保留提供的包。所以我有 web --> Joomla --> jumi --> php --> python --> backend...

    基于 Kaivosukeltaja 的答案和 cmets 以及支持文章 executing Python script in PHP and exchanging data between the twohttp://pymotw.com/2/json/

    在 jumi 应用程序/php-script 中,我放置了(除其他外)以下内容,以允许将 HTTP POST 作为 JSON 对象发送到我支持的 python 脚本。

    echo passthru('/usr/bin/python /var/www/html/joomla/jumi/ldap-script.py '. escapeshellarg(json_encode($_POST)))
    

    然后,在 python 脚本中,我使用 sys.argv 读取变量,并使用 simplejson 将 json 对象从 PHP 映射到 python 字典(高度简化):

    import sys
    import simplejson as json
    myjson = sys.argv[1]
    mydict = json.loads(myjson)
    

    我现在可以测试是否可以找到我想要的密钥:

    if ( 'var1' in mydict):
        print mydict['var1']
    

    用户以简单的形式向这些变量发帖:

    <form name="INPUT" action="" method="POST">
        MyVar1 <input type="number" name="var1">
        <input type=SUBMIT" value="Submit">
    </form>
    

    狂热的读者会看到,在这些步骤的大部分中都引用了“var1”,而 PHP 没有,也不必知道它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      相关资源
      最近更新 更多