Как использовать Ajax с CherryPy для запуска скрипта python до S SH в Raspberry Pi Zero из веб-интерфейса - PullRequest
1 голос
/ 13 февраля 2020

Я пытаюсь создать веб-интерфейс для удаленного управления GoPro. Для этого у меня есть Raspberry Pi 3B, который я планирую использовать в качестве веб-сервера, подключенного к Pi Zero через USB, который подключен через Wi-Fi к GoPro. Таким образом, всякий раз, когда * SH поступает в Pi Zero от Pi 3B, я могу управлять GoPro. Итак, теперь я хочу создать веб-сервер с CherryPy и Ajax, чтобы я мог создать веб-интерфейс для управления GoPro при подключении к той же сети WiFi, что и Pi 3B (веб-сервер).

Я читал документацию CherryPy , чтобы попытаться понять, как использовать Ajax с CherryPy. Я мог реализовать его раньше с более базовым c методом CherryPy (без Ajax), но он сделал его go на другой веб-странице, тогда как для этого я хочу, чтобы он оставался на той же веб-странице, которая почему я использую 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>

А вот код 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)

Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я вписываю значение в поле ввода и нажимаю кнопку, появляется предупреждение «Беги, делай фотографии!» и в консоли я вижу, что веб-сервер получил запрос, но сценарии python не запускаются методом «POST». Я хочу, чтобы метод POST выполнялся, а два метода python «connect» и «takePhotos» выполнялись (чего сейчас не происходит).

Заранее большое спасибо!

1 Ответ

1 голос
/ 13 февраля 2020

Проиграв все утро и узнав больше о Ajax, я наконец-то разобрался с ответом, и он так же глуп и прост, как я думал.

В строке 7 индекса. html file, Я должен был изменить $.post("/take") на $.post("/takePhotos")

...