flask流式输出-SSE服务-二、实现

时间:2024-03-03 17:01:05
  1. flask demo
from gevent import monkey
monkey.patch_all()         #并行
import time
from flask import Response, stream_with_context
from flask import Flask
from gevent.pywsgi import WSGIServer
from flask import request
app=Flask(__name__)
from flask_cors import CORS
CORS(app)            #解决跨域问题


def predict():
    chatbot=[""]
    mid='''
    一、引言\n1. 背景介绍\n2. 研究意义\n\n二、多旋翼无人机概述\n
                                      1. 多旋翼无人机的定义\n2. 多旋翼无人机的特点\n3. 多旋翼无人机的基本结构\n\n
                                      三、多旋翼无人机控制方法\n1. 手动控制\n2. 遥控控制\n3. 自主控制\n\n
                                      四、多旋翼无人机调度方法\n1. 手动调度\n2. 遥控调度\n3. 自主调度\n\n
                                      五、多旋翼无人机应用实例\n1. 农业领域\n2. 航拍领域\n3. 搜索救援\n
                                      4. 其他应用领域\n\n六、多旋翼无人机的安全问题\n1. 飞行安全隐患\n
                                      2. 数据隐私问题\n3. 人机交互问题\n\n七、结论\n1. 研究总结\n2. 研究局限\n3. 研究展望
    '''
    s=""
    for response in mid:
        s+=response
        yield [s], []

import json



@app.route('/stream',methods=["GET","POST"])
def stream():
    kwargs = request.get_data(as_text=True)
    @stream_with_context
    def generate():
        data_stream = predict()
        for data in data_stream:
            print(data)
            time.sleep(0.1)
            yield str("data:") + str(data) + "\n\n"       #必须保证 前面是“data:”      后面是“\n\n”

    headers = {
        'Content-Type': 'text/event-stream',
        'Cache-Control': 'no-cache',
        'X-Accel-Buffering': 'no',
        "Access-Control-Allow-Origin":"*",
        "Access-Control-Allow-Methods":"GET,POST",
        "Access-Control-Allow-Headers":"x-requested-with,content-type"
    }
    return Response(generate(),mimetype="text/event-stream",headers=headers)    #类型event-stream
if __name__ == '__main__':
    http_server = WSGIServer(('0.0.0.0', int(8081)), app)
    http_server.serve_forever()

测试:

from sseclient import SSEClient
messages = SSEClient('http://127.0.0.1:8081/stream')
for msg in messages:
    print(msg.event,"data")
    print([msg.data])
  1. 前端遇到的问题
    前端一直接受不到消息,原因:存在跨域。解决:前端做一个代理,即可打通。