通过queue实现前端的被动接收

一般请求都是由前端主动发起请求,后端响应,但有些情况必须要后端达到一定条件了才向前端相应数据,这就变成前端被动了。比如微信接收信息,只有别人给你发消息,你才能被动接收消息。

最近做了个项目,当有人经过摄像头的时候,经过人脸识别,把识别出来的信息主动返回给前端。这种情况可以通过后端阻塞的方式实现,也就是让前端先发送一个请求给后端,后端阻塞,直到达到某种条件再响应,前端获取到响应数据的时候立马重新发送一个请求。

可以通过queue的方式实现

from queue import Queue
from flask import Flask, request, jsonify, session
from flask_cors import *

import get_user

app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False
CORS(app, supports_credentials=True)  # 和前端联调测试,允许跨域请求
q = Queue(maxsize=100)   # 设置队列允许最大的元素,100个

@app.route('/', methods=['POST'])
def get_callback():
    """监听face++的回调函数,只要有人经过镜头,就会把信息发送给这个路由"""
    data = request.get_json()
    subject_id = data.get('subject_id')
    # 根据subject_id获取员工信息
    if subject_id is None:
        data_one = {'name': '陌生人', }
    else:
     # get_one为根据subject_id调用数据库数据的一个函数 data_one
= get_user.get_one(subject_id) data_one['gender'] = data['gender'] data_one['age'] = data['age']# 把数据放入队列,实现队列去重 li = [] if data_one in li: return jsonify({'code': 203}) else: li.append(data_one) # 把数据添加到列表模拟队列 try: q.put(data_one, timeout=10) # 把数据添加到队列如果队列已经满了,再添加数据,超过10秒就抛异常 except: pass return jsonify({'code': 200}) @app.route('/show',methods=['POST']) def get_vote():
  """前端请求这个接口""" ret
= {'status': True,'data': None} # 构造一个json数据 try: data_one = q.get() # 从队列取出数据,如果没有数据,会阻塞在这一步 ret['data'] = data_one except: ret['status'] = Falsereturn jsonify(ret) if __name__ == '__main__': app.run(port=9010, host='0.0.0.0')

 

posted @ 2019-08-22 17:05  wanglai  阅读(613)  评论(0编辑  收藏  举报