繁体   English   中英

如何使用 Ajax 和 CherryPy 运行 Python 脚本,以从 Web 界面通过 SSH 连接到 Raspberry Pi Zero

[英]How to use Ajax with CherryPy to run a python script to SSH into a Raspberry Pi Zero from a web interface

我正在尝试制作一个 Web 界面来远程控制 GoPro。 到目前为止,我有一个 Raspberry Pi 3B,我打算将它用作网络服务器,它通过 USB 连接到 Pi Zero,然后通过 WiFi 连接到 GoPro。 因此,每当我从 Pi 3B 通过 SSH 连接到 Pi Zero 时,我都可以控制 GoPro。 所以现在,我想用 CherryPy 和 Ajax 创建一个 Web 服务器,这样我就可以创建一个 Web 界面来在连接到与 Pi 3B(Web 服务器)相同的 WiFi 网络时控制 GoPro。

我一直在阅读CherryPy 文档以尝试了解如何将 Ajax 与 CherryPy 结合使用。 我之前能够使用更基本的 CherryPy 方法(没有 Ajax)实现它,但它让它进入了不同的网页,而为此,我希望它留在同一个网页上,这就是我使用 Ajax 的原因。 我以前从未真正使用过 Ajax,所以我很陌生,我基本上尽力复制 CherryPy 文档中的示例,但没有奏效,所以如果我在这里遗漏了一些简单的东西,请原谅我。

这是 HTML 页面代码:

<html>
<head>
    <script src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
    <script type="text/javascript">
    $(document).ready(function(){
        $("#takePhotos").click(function(e){
            $.post("/take", {"count": $("input[name='count']").val()})
            .done(alert("Running Take Photos!"));
            })
            e.preventDefault();
        });    
    </script>
</head>
<body>
    <input type="text" value="" name="count"/>
    <button id="takePhotos">Take Photos</button>
</body>

这是 Web 服务器的 python 代码:

import cherrypy
import os, os.path
import GoPro as gp
import requests


class RaspiServer(object):
    @cherrypy.expose
    def index(self):
    return open('index.html')

@cherrypy.expose
class GPWebService(object):
@cherrypy.tools.accept(media="text/plain")
def GET(self,count):
    print("running")

def POST(self,count):
    print("running")
    gp.connect("pi", "raspberrypizero.local", "raspberry")
    gp.takePhotos(count)
    return count


if __name__ == '__main__':
conf = {
    '/': {
        'tools.sessions.on': True,
        'tools.staticdir.root': os.path.abspath(os.getcwd())

    },
    '/takePhotos':{
        'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
        'tools.response_headers.on': True,
        'tools.response_headers.headers': [('Content_Type', 'text/plain')]

    },
    '/static':{
        'tools.staticdir.on': True,
        'tools.staticdir.dir': "./public"
    }
}
cherrypy.config.update({'server.socket_host': '0.0.0.0'})
webapp = RaspiServer()
webapp.takePhotos = GPWebService()
cherrypy.quickstart(webapp, '/', conf)

我面临的问题是,每当我在输入字段中输入一个值并单击按钮时,警报就会显示“正在运行拍照!” 在控制台中,我可以看到 Web 服务器已收到请求,但 python 脚本没有在“POST”方法中运行。 我想要发生的是 POST 方法执行并且两个 python 方法“connect”和“takePhotos”执行(现在没有发生)。

首先十分感谢!

在玩了一上午并学习了更多关于 Ajax 的知识之后,我终于找到了答案,它和我想象的一样愚蠢和简单。

在 index.html 文件的第 7 行,我不得不将$.post("/take")更改$.post("/takePhotos")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM