2017-08-27 28 views
0

我正在创建一个将数据发送到客户端的应用程序,然后客户端会打印这些数据。如何使用Flask在Python中将数据从服务器发送到客户端?

我使用Flask作为处理服务器端的后端框架,另一个为当前客户端生成随机ID的Python脚本,客户端每隔4秒检查一次新数据是否进入,如果获取数据它应该打印它。

后端代码

@app.route('/data/api/interact/<string:client_id>', methods=['GET', 'POST']) 
@login_required 
def interact(client_id): 
    global data 

    form = Interact() 
    data = '' 

    if form.is_submitted(): 
     get_data = form.ct.data 

     if get_data == 'hello': 
      data = 'Hi how are you?' 

     return redirect(url_for('data_handler', client_id=client_id, data=form.ct.data)) 

    return render_template('interact.html', form=form, client_id=client_id) 

@app.route('/data/api/interact/handler/', methods=['GET', 'POST']) 
def data_handler(): 
    client_id = request.args.get('client_id') 
    get_data = request.args.get('data') 
    return json.dumps({'client_id': client_id, 'data': get_data}) 

客户端脚本

handler_url = 'http://192.168.0.102:5000/data/api/interact/handler/' 

class check_data(threading.Thread): 
    def __init__(self, client_id): 
     threading.Thread.__init__(self) 
     self.event = threading.Event() 
     self.client_id = client_id 

    def run(self): 
     global handler_url 

     try: 
      while not self.event.is_set(): 
       file = urllib2.urlopen(handler_url) 
       xml = file.read() 
       print xml 
       file.close() 
     except: 
      pass 

     self.event.wait(4) 

def new_client(): 
     client_id = 'ClientId' + str(random.randrange(1, 500)) 
     return client_id 

client_id = 'null' 

while client_id == 'null': 
    client_id = new_client() 

    if 'null' not in client_id: 
     break 

print 'Client ID: ' + client_id 

client = check_data(client_id) 
client.start() 

一切正常,但如果我从服务器发送数据到客户端它打印:

{'data': '', 'client_id': null}

回答

1

client_id未传递到服务器,服务器预计将获得client_iddata作为查询参数。相反,您正在访问没有任何参数的网址

file = urllib2.urlopen(handler_url)

Passing query string parameters为GET请求可以与

url = handler_url + '?client_id' + self.client_id +'&data=YOURDATA_HERE' 
file = urllib2.urlopen(url) 

做你也许可以使用urlencode使这更优雅的方式。

+0

感谢您的关注,您的回答也帮助了我;) – makmani

2

在这段代码:

@app.route('/data/api/interact/handler', methods=['GET', 'POST']) 
def data_handler(): 
    client_id = request.args.get('client_id') 
    get_data = request.args.get('data') 
    return json.dumps({'client_id': client_id, 'data': get_data}) 

你跟client_iddata值,从查询参数(request.args)得到返回JSON,但你不要把那些参数(urllib2.urlopen(handler_url))。

+0

我需要提供的参数handler_url,或客户端将完成这项工作? – makmani

+0

我没有注意到'request.args' – makmani

+1

@makmani无论逻辑应该是什么,但现在处理程序返回它收到的东西,这没有多大意义,如果这些值应该在另一个处理程序中设置,那么您需要将它们存储在某处。 –

相关问题