Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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+;nginx fcgi-输出大响应?_Python_Http_Web_Flask - Fatal编程技术网

Python Flask+;nginx fcgi-输出大响应?

Python Flask+;nginx fcgi-输出大响应?,python,http,web,flask,Python,Http,Web,Flask,我将PythonFlask+nginx与FCGI一起使用 对于某些请求,我必须输出大量响应。通常,这些响应是从套接字获取的。目前我正在做这样的回应: response = [] while True: recv = s.recv(1024) if not recv: break response.append(recv) s.close() response = ''.join(response) return flask.make_response(response,

我将PythonFlask+nginx与FCGI一起使用

对于某些请求,我必须输出大量响应。通常,这些响应是从套接字获取的。目前我正在做这样的回应:

response = []
while True:
    recv = s.recv(1024)
    if not recv: break
    response.append(recv)
s.close()
response = ''.join(response)

return flask.make_response(response, 200, {
                                           'Content-type': 'binary/octet-stream',
                                           'Content-length': len(response),
                                           'Content-transfer-encoding': 'binary',
                                           })
问题是我实际上不需要这些数据。我还有一种方法可以确定从套接字获取的确切响应长度。因此,我需要一种发送HTTP头的好方法,然后直接从套接字开始输出,而不是将其收集到内存中,然后提供给nginx(可能是通过某种流)

我无法找到解决这个看似常见问题的办法。如何实现这一目标


谢谢大家!

如果
flask.make\u response
中的
response
是一个iterable,它将被迭代以生成响应,并且每个字符串都会自己写入输出流

这意味着您还可以返回一个生成器,当迭代时,该生成器将生成输出。如果您知道内容长度,那么您可以(并且应该)将其作为标题传递

一个简单的例子:

from flask import Flask
app = Flask(__name__)
import sys
import time
import flask

@app.route('/')
def generated_response_example():
    n = 20
    def response_generator():
        for i in range(n):
            print >>sys.stderr, i
            yield "%03d\n" % i
            time.sleep(.2)

    print >>sys.stderr, "returning generator..."
    gen = response_generator()

    # the call to flask.make_response is not really needed as it happens imlicitly 
    # if you return a tuple.
    return flask.make_response(gen ,"200 OK", {'Content-length': 4*n})

if __name__ == '__main__':
    app.run()
如果你运行这个并在浏览器中尝试,你会看到一个很好的激励计数

(未设置内容类型,因为如果我这样做,我的浏览器似乎会等待整个内容流化后再呈现页面。
wget-qO-localhost:5000
没有此问题