Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 请求和Flask+的流式处理失败;芹菜_Python_Flask_Streaming_Celery - Fatal编程技术网

Python 请求和Flask+的流式处理失败;芹菜

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

背景:我以前见过类似的问题(如和),但第一个问题似乎从未得到解决,第二个问题是旧版本

我正在测试Flask的流式响应,这是我们将对API进行更改的一部分。我在本地主机上设置了一个烧瓶站点,一个烧瓶和一个芹菜队列。两者都工作正常,任务正在芹菜队列中显示并完成

烧瓶站点是一个蓝图,设置如下:

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':,下运行,然后从命令提示符调用脚本。对;这至少排除了服务器或中间件干扰的可能性。