如何从Javascript(jquery / ajax)调用Python脚本中的特定函数/方法

时间:2012-12-10 19:55:24

标签: python ajax function

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

我读了一个教程,说要传递我想要调用的函数名。我做到了 在Python中,我尝试了

这是我的ajax功能

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

这是Python

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

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

3 个答案:

答案 0 :(得分: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);
   }
});

答案 1 :(得分:1)

即使你没有提到你正在使用什么样的Web框架(如果有的话),我将从你的url命名中假设你试图在服务器上直接调用python脚本。

此方法的唯一方法是将monStat.py脚本结构化为CGI script,并相应地托管在服务器上(以执行CGI脚本的方式)。您的javascript意味着您要对此脚本发出POST请求,因此您的python脚本需要接受POST请求,然后读取参数并对其进行操作。你不能只在javascript中将一个callable命名为一个字符串,并让CGI脚本自动知道要运行什么。这是Web框架提供高级URL处理的地方。

如果你试图通过url调用常规python脚本,那就不行了。最基本的原始方法是使用python CGI module。这对于刚学习和入门很有帮助,但这是一种非常低效和过时的方法。您应该查看一个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()

答案 2 :(得分:0)

这是一个开始:

import cgi
fs = cgi.FieldStorage()

print "Content-type: text/plain\n"
for key in fs.keys():
    print "%s = %s" % (key, fs[key].value)