2014-05-20 32 views
0

我試圖控制樹莓派上的一些硬件,並運行一個gevent服務器,以通過網絡獲取/設置它們。作爲背景,我應該注意到這不會在公共互聯網上運行,並且永遠不會有超過1個連接。把它想象爲建立一個adsl路由器的管理面板....使用定製的gevent服務器與燒瓶

應用程序將不斷從傳感器讀取並相應地調整輸出。目前,我有這樣的事情:

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如果我解析ENVIRON,但我想是能夠具有長頸瓶的應用得到並在此服務器上設置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; 
} 

瓶服務器代碼:

#!/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:

我希望我幫助!

+0

感謝您的回答 - 我已經投了票,但沒有接受它,因爲它似乎可能容易受到競爭條件的影響,我稱爲backgroundtask的用戶嘗試在用戶同時設置全局輸入。最後,我使用類似於此處描述的演員模型解決了問題:http://sdiehl.github.io/gevent-tutorial/#actors – bjw