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")
答案 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 two和http://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则不是,也不一定知道它。