0

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/mod_python/ 运行 python 脚本一样。 ..?

Python 处理表单变量:

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

2 回答 2

1

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

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

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

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

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

于 2013-07-10T09:37:02.320 回答
0

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

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

基于 Kaivosukeltaja 的答案和评论以及支持在 PHP 中执行 Python 脚本并在两者之间交换数据的文章和http://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)))

sys.argv然后,在我用来读取变量的 python 脚本中,并将simplejsonjson 对象从 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 没有,也不必知道它。

于 2013-07-10T14:00:57.077 回答