3

澄清一下:我通过 Apache Web 服务器将其作为 cgi 运行。这不是问题我的问题是关于当我通过 ajax 请求调用 Python 脚本时指定运行哪个函数的方法。

我读了一个教程,说将我想要调用的函数名作为 var 传递。我这样做了。在 Python 中,我尝试过

这是我的ajax函数

 $(document).ready(function() {
    $.ajax({
       url: "monStat.py",
       type: "post",
       data: {'callFunc':'isRunning'},
       success: function(response){
           $('#blurg').html(response).fadeIn(1500);
       }
    });
 });

这是蟒蛇

 def main():
      if callFunc:
           funcResp = isRunning()
      else:
           print("No function passed")

 def isRunning( process_name ):
    ''' the content ''' 
4

3 回答 3

4

您需要使您的脚本具有网络功能。我没有使用过 CGI,所以这里有一个Flask的例子:

from flask import Flask, request

app = Flask(__name__)

@app.route('/is_running', methods=['POST'])
def isRunning():
    process_name = request.values.get('name', None)

    ''' the content '''

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=5000)

现在,您只需发送请求到/is_running

$.ajax({
   url: "/is_running",
   type: "post",
   data: {'name': 'ls'},
   success: function(response){
       $('#blurg').html(response).fadeIn(1500);
   }
});
于 2012-12-10T20:04:39.620 回答
1

即使您没有提及您使用的是哪种 Web 框架(如果有),我还是会从您的 url 的命名中假设您正在尝试直接调用服务器上的 python 脚本。

唯一可行的方法是,如果您的monStat.py脚本被构造为CGI 脚本,并相应地托管在您的服务器上(以执行 CGI 脚本的方式)。您的 javascript 暗示您要向该脚本发出 POST 请求,因此您的 python 脚本将需要接受 POST 请求,然后读取参数并对其进行操作。您不能只在 javascript 中将可调用对象命名为字符串,并让 CGI 脚本自动知道要运行什么。这是提供高级 URL 处理的 Web 框架的位置。

如果您试图通过 url 调用常规的 python 脚本,那是行不通的。最基本的原始方法是使用 python CGI 模块。这对于刚开始学习和入门很有用,但这是一种非常低效且过时的方法。您可能应该研究一个 Web 框架: Python WebFrameworks

更新

正如您所说,您实际上正在使用 CGI 脚本......
“路由”是您在使用 Web 框架时免费获得的东西。它将传入的请求带入主循环并决定应该去哪里处理它。当您使用CGI 时,您必须自己执行此操作。每次您向 CGI 脚本发出请求时,它都会像普通脚本一样执行,具有普通入口点。

在该入口点中,您必须阅读请求。如果请求是 POST 并且包含“is_running”,那么您可以将该请求转发给您的is_running()处理程序。“函数名”只是字符串数据。由您的代码读取请求并确定要执行的操作。

这是一个超级粗略的示例,您可以在其中将一些可接受的处理程序映射到您允许的函数:

#!/usr/bin/env python
import cgi
import cgitb
cgitb.enable()

def isRunning(form):
    print "Content-Type: text/html\n" 
    print "isRunning()"
    print form.getvalue('name') 

def _error(*args):
    print "Content-Type: text/html\n" 
    print "Error"


HANDLERS = {
    'isRunning': isRunning
}


def main():
    form = cgi.FieldStorage()

    h_name = form.getvalue('callFunc')
    handler = HANDLERS.get(h_name, _error)
    handler(form)


if __name__ == "__main__":
    main()
于 2012-12-10T20:02:38.550 回答
0

这是一个开始:

import cgi
fs = cgi.FieldStorage()

print "Content-type: text/plain\n"
for key in fs.keys():
    print "%s = %s" % (key, fs[key].value)
于 2012-12-10T20:34:26.787 回答