将表单变量从PHP传递给Python(Joomla中的jumi内部)

时间:2013-07-10 08:12:18

标签: php python joomla jumi

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

PHP可以将HTTP POST请求传递给python,以便python中的cgi模块会像“从网络上传递”一样读取它吗?

基本设置:Joomla CMS,带有jumi模块。
NB! 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")

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:0)

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

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

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

在jumi应用程序/ php脚本中,我已将(以及其他内容)以下内容放在允许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则不是,也不一定知道它。