我正在尝试控制覆盆子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
成为服务器的应用程序?
答案 0 :(得分:1)
以下代码是客户端查询的方法,然后打印并再次更改。
使用两个路由客户端可访问:
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)
运行控制台:
在客户端:
我希望我帮忙!