Используя настроенный сервер Gevent с колбой

Я пытаюсь управлять несколькими аппаратными средствами на Raspberry Pi и запустить сервер Gevent, чтобы включить / настроить их через Интернет. В качестве фона, я должен отметить, что он не будет работать через общедоступный интернет и никогда не будет иметь более 1 соединения. Думайте об этом как о создании админ-панели для маршрутизатора adsl....

Приложение будет постоянно считывать данные с датчика и соответственно регулировать выход. На данный момент у меня есть что-то вроде этого:

class MyServer(WSGIServer):

    somevalue = 0

    def backgroundtask(self, *args, **kwargs):
        #note this function should run as frequently as possible 
        while True:
            # do stuff including reading sensors and running motors
            self.somemethod(self.somevalue)
            gevent.sleep(0)

    def __init__(self, listener, handle=None, **kwargs):
        WSGIServer.__init__(self, listener, **kwargs)
        self.backgroundtask = gevent.spawn(self.backgroundtask)

    def application(self, environ, start_response):
        status = '200 OK'
        headers = [
            ('Content-Type', 'text/html')
        ]

        yield str(self.somevalue)

Это работает хорошо, и я мог бы установить somevalue из входящего запроса, если я анализирую окружение, но мне бы хотелось, чтобы приложение Flask получало и устанавливало somevalue на этом сервере, чтобы я мог использовать все стандартные средства обработки форм.

Это возможно? Как я могу сделать app=Flask(__name__) быть приложением сервера, не теряя доступа к self свойства сервера?

1 ответ

Следующий код представляет собой метод, запрашиваемый клиентом, а затем распечатывает и снова изменяет его.

Используя доступный по двум маршрутам клиент:

  • / GetVar (например, достижение php: ht tp: // IP: 2020 / getVar /)
  • / SetVar (например, достижение php: ht tp://IP:2020/setVar/)

Код клиента Php:

$url = 'http://IP:2020/setVar/';
$data = array('Var' => 9);
RunScript($data, $url);

function RunScript($data, $url) {
$options = array(
    'http' => array(
    'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
    'method'  => 'POST',
    'content' => http_build_query($data),
    ),
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
print $result;  
}

Код сервера Flask:

#!/usr/bin/python

from flask import Flask, jsonify
from flask import make_response
from flask import request
import sys

app = Flask(__name__)

somevalue = '?'
#********************************************************** Routs *****************************************************

@app.route('/setVar/', methods=['POST'])
def set_Var():
    try:
        global somevalue
        somevalue = request.form['Var']
        print 'Newvalue: ' + str(somevalue)
    except Exception, e:
        print e
    return ''

@app.route('/getVar/', methods=['POST'])
def get_Var():
    global somevalue
    print somevalue
    return somevalue

#********************************************************** Routs end *************************************************
if __name__ == '__main__': 
    app.run(threaded=True, host='0.0.0.0', port=2020)

Запустите консоль: Запустите консоль

На стороне клиента:На стороне клиента

Я надеюсь, что помог!

Другие вопросы по тегам