使用带烧瓶的定制gevent服务器

时间:2014-05-20 14:39:13

标签: python flask gevent

我正在尝试控制覆盆子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)

这样可行,如果我解析environ,我可以从传入的请求中设置somevalue,但我想要的是能够让Flask应用获取并设置somevalue服务器,所以我可以使用所有标准的表单处理。

这可能吗?如何在不失去对服务器app=Flask(__name__)属性的访问权限的情况下使self成为服务器的应用程序?

1 个答案:

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

运行控制台: Run the console:

在客户端: On the client side:

我希望我帮忙!