2014-02-28 71 views
1

我想在单击一个图像(按钮)时允许我通过web界面控制伺服器来调用python函数。如何从jquery post执行python函数

这里是我的jQuery代码部分:

$('#left_button').click(function(){ 
      $.post("cameraservo2.py", {direction:"left"}).done(function (reply) { 
       $('#camerapos').empty().append(reply); 
       alert("left button clicked");}); 

     }); 

这是我的Python代码:

#!/usr/bin/python 

def index (self, **data): 

    import pigpio 
    import time 

    servos=4 
    key = data['direction'] 

    m=1500 
    while (m >= 500 and m <= 2500): 
     if (key =="left"): 
      m=m+100 
     elif (key =="right"): 
      m=m-100 

    pigpio.start() 

    pigpio.set_servo_pulsewidth(servos, m) 
    servostatus= "Servo {} {} micro pulses".format(servos[0], key, m) 
    print servostatus 
    time.sleep(1) 

    pigpio.stop() 

    return servostatus 

我的问题是在点击按钮时,它会提醒“鼠标左键点击“这意味着它已经运行了python文件。但不是显示“servostatus”,我得到了整个Python代码显示在我的#camerapos股利。

如果我需要发布更多信息,请让我知道。谢谢!!

回答

2

您需要一些额外的工具才能从客户端查询调用服务器端python代码。 Flask是一个轻量级的Python Web框架,通常是这类问题的首选工具。

瓶文档:http://flask.pocoo.org

瓶使用jQuery:http://flask.pocoo.org/docs/patterns/jquery/

瓶使用jQuery POST:how can I use data posted from ajax in flask?

要与瓶/ jQuery的使用POST,你必须标注在蟒蛇的接收方法。你的代码看起来像这样。

@app.route('/servo_pos', method=["POST"]) 
def servo_pos(): 
    do_your_work_here 
    return jsonify({"servo_pos", ret_val}) 

你还需要调整一下你的jQuery。

$('#left_button').click(function(){ 
      $.post("/servo_post", {direction:"left"}).done(function (reply) { 
       $('#camerapos').empty().append(reply); 
       alert("left button clicked");}); 

     }); 

我不确定这一步,但您可能还需要用.ajax替换.post。由于您不希望在显示新内容之前重新加载页面,因此这不是传统的发布请求,而是ajax。

另外,是否有一个原因,你必须使用一个post请求,并GET_JSON将无法​​正常工作,就像上面的jquery ajax模式?

重点说明:

  1. 添加`方法= [ 'POST']
  2. 数据请求参数在data.request.data
  3. 返回数据中发现在一个 “jsonified” 字典要求from Flask import jsonfiy
+0

感谢您的回复。你的意思是我可以添加这个'从瓶子进口烧瓶,jsonify,render_template,请求 app = Flask(__ name__) @ app.route('/')'? – yvonnezoe

+0

但我在烧瓶页面上使用'post'而不是'get'。 – yvonnezoe

+0

这很好,你可以很容易地使用POST和Flask。只需相应地注释您的Flask功能即可。上面更新了我的答案。 –

0

除了运行完整的服务器端python web框架, 最小的方法可能是使用cgi例如uwsgi

有关最小工作设置的更多信息,请参阅官方python docs

交互

如果你的web应用需要与服务器进行更多的互动,你可能要考虑使用的WebSockets,而不是AJAX的通信框架。 注意事项: 旧版浏览器不支持WebSockets。

well developed framework that has websocket support is tornado的示例。

+0

谢谢!我之前尝试过cgi,但我不想使用表单格式。我点击时使用图像按钮,会在python中执行一个函数 – yvonnezoe

+0

@ yvonnezoe-我添加了一些关于您可能需要更多交互性的情况;我的建议是使用websockets等龙卷风 – jmetz