1. 明确问题/需求
最近遇到这么个问题:
服务器A上有个服务a,请求一次后会生成一段文本信息,连续不断地生成,大概总耗时在10~40s,返回类型是一个生成器generator;
服务器B要接收该服务的结果,并实时将它进行解析、处理后输出
所以看起来问题并不复杂,简单拆解下:
- 请求端(py-requests):服务器A,接收generator
- 服务端(py-Flask):服务器B,实时接收处理generator
2. 解决方案
因为确实很简单,所以直接上code
服务端(Flask端)
from flask import Flask, Response
app = Flask(__name__)
def my_generator():
# 生成结果的逻辑
i = 0
while True:
yield str(i)
i += 1
@app.route('/api/endpoint')
def handle_request():
generator = my_generator()
# 返回一个生成器作为响应
return Response(generator, mimetype='text/plain')
if __name__ == '__main__':
app.run()
这里的my_generator()只不过是个返回生成器的示例函数。返回的generator用Response进行修饰。
请求端(requests端)
import requests
# 发送GET请求
response = requests.get('http://localhost:5000/api/endpoint', stream=True)
# 持续接收并打印生成的结果
for line in response.iter_lines():
if line:
print(line.decode())
这里接收结果response,然后用iter_lines()方法将generator中的结果迭代出来;同时,要实现流式返回,需要指定stream=True。