Python 请求和Flask+的流式处理失败;芹菜
背景:我以前见过类似的问题(如和),但第一个问题似乎从未得到解决,第二个问题是旧版本 我正在测试Flask的流式响应,这是我们将对API进行更改的一部分。我在本地主机上设置了一个烧瓶站点,一个烧瓶和一个芹菜队列。两者都工作正常,任务正在芹菜队列中显示并完成 烧瓶站点是一个蓝图,设置如下:Python 请求和Flask+的流式处理失败;芹菜,python,flask,streaming,celery,Python,Flask,Streaming,Celery,背景:我以前见过类似的问题(如和),但第一个问题似乎从未得到解决,第二个问题是旧版本 我正在测试Flask的流式响应,这是我们将对API进行更改的一部分。我在本地主机上设置了一个烧瓶站点,一个烧瓶和一个芹菜队列。两者都工作正常,任务正在芹菜队列中显示并完成 烧瓶站点是一个蓝图,设置如下: from flask import Blueprint, Response from time import sleep from celery import Celery import logging l
from flask import Blueprint, Response
from time import sleep
from celery import Celery
import logging
log = logging.getLogger(__name__)
cel = Blueprint('celerytest', __name__)
list_nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
celery = Celery('flask_test', broker='amqp://localhost:5672',
backend='amqp://localhost:5672')
@celery.task()
def squared(number):
result = number ** 2
print result #Shows up inside celery so I know it's working
sleep(result)
rstr = str(result) + '\n'
return rstr
@cel.route('/view', methods=['GET'])
def view_two():
tasks = []
for a in list_nums:
tasks.append(squared.delay(a))
def generate(things):
for task in things:
print 'doin it'
yield task.get()
return Response(generate(tasks), direct_passthrough=True)
然后将其连接到在localhost:1000上运行的应用程序。为了测试它,我运行了一个脚本:
def gen_lines():
req = requests.Request(url='http://localhost:1000/testing/view',
method='GET').prepare()
s = requests.Session()
resp = s.send(req, stream=True)
for line in resp.iter_lines():
if line:
yield line
print "Not blocking, honest"
for line in gen_lines():
print line
我目前在Flask服务器上看到类似这样的结果:
doin it
doin it
doin it
等。它们在正确的时间发生(例如,1秒、4秒、9秒等)
运行脚本时,我看到
Not blocking, honest
196秒后:
1
4
9
16
etc...
我假设一旦设置正确,我将看到1(一秒钟后)、4(四秒钟后)等等,而不是在最后遍历整个列表
以前,我的剧本是:
post = requests.get('http://localhost:1000/testing/view', stream=True)
for line in post.iter_lines():
print line
但我根据我链接的第一个答案的建议修改了它。这个变化似乎没有什么帮助
有人知道我是否在任何一方遗漏了导致流媒体失败的选项吗
谢谢
埃塔:我刚刚用curl(
curl-G)进行了测试http://localhost:1000/testing/view
),并且流媒体在curl中运行没有问题。因此,这个问题必须与requests模块有关。您是否启用了中间件?您使用的是什么WSGI设置?我使用的是一个只安装芹菜、请求和烧瓶的虚拟环境。这意味着没有中间件,默认的WSGI设置正确吗?ETA:请求也在虚拟环境中;你跑得怎么样?使用内置服务器?app.run('localhost',port=1000)在我的if name='main':,下运行,然后从命令提示符调用脚本。对;这至少排除了服务器或中间件干扰的可能性。