flask stream流式传输在uwsgi环境下流不动

python flask 做的一个流式发送的的接口,服务端接口如下:

from flask import Flask, Response
import time
app = Flask(__name__)
@app.route('/stream', methods=['POST'])
def stream():
    def generate():
        for i in range(10):
            yield str(i)
            time.sleep(1)
    return Response(generate(), mimetype='text/plain')

if __name__ == '__main__':
    app.run(debug=True,host='0.0.0.0')

客户端如下

import requests
import time 
response = requests.get('http://127.0.0.1:5000/stream', stream=True)
for chunk in response.iter_content():
    print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),chunk)

正常运行客户端之后会一次请求,然后每秒钟打印一个数字,进行流式传输内容,目前的代码可以实现,但是我加上了域名和ssl和uwsgi和nginx之后,就没有流式传输的效果了,我的这个是部署在宝塔上的一个测试应用,ssl那些都逐个测试过了,目前接口可以通,但是就是没有流式效果,我初步判断是nginx和uwsgi配置里面有问题,但是这两个配置都是宝塔自动生成的,不太知道怎么改。问了gpt他告诉我的那些都白扯,还希望有经验的大手子,帮我看一看问题所在

参考GPT和自己的思路:在 uwsgi 和 Nginx 配置中确保开启了长连接和流式传输。您可以在 uwsgi 的配置文件中添加如下参数:

http-timeout = 120
http-keepalive = true
chunked-input = 8192


在 Nginx 的配置文件中,需要添加以下参数:

proxy_buffering off;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


这些参数的具体配置可能因您的具体情况而异。您可以根据您的需要进行调整。完成这些配置后,重新启动 uwsgi 和 Nginx,看看是否解决了问题。

看看是不是你的宝塔那里的配置问题,端口没有打开

使用了uwsgi和nginx之后,检测下相应的配置:
1、检测uwsgi中是否配置了http-socket

http-socket = 127.0.0.1:8000

2、nginx配置中,配置下uwsgi_pass 参数

location / {
    include uwsgi_params;
    uwsgi_pass 127.0.0.1:8000;
}

3、在你的flask中,在generate方法中将return 返回的数据格式改为chuck看看:
headers={'Transfer-Encoding': 'chunked'}

①配置完nginx和uwsgi,这两个配置启动之后就可以正常运行项目了。之前看千峰教育的视频,里边启动了nginx和uwsgi后还python manege.py runserver 了一下,害我陷入了这个误区。其实只要配置正确,启动uwsgi即可。
至于如何检查是否是用uwsgi而不是flask自带的werkinx和uwsgi,这两个配置启动之后就可以正常运行项目了。之前看千峰教育的视频,里边启动了nginx和uwsgi后还python manege.py runserver 了一下,害我陷入了这个误区。其实只要配置正确,启动uwsgi即可。
至于如何检查是否是用uwsgi而不是flask自带的werkzeug,直接看响应头里边的server 字段,如果是werkzeug则没用用到uwsgi。
②uwsgi配置文件里边千万不要手贱在配置信息那一行后边写什么注释,
哪怕像在 chdir=/usr/Movie后边多一个空格,都被给你报找不到文件路径的错误。
③如果你的uwsgi里边是

socket=0.0.0.0:5051

然后你在浏览器的地址栏输入
主机号:5051
那么就会报invalid request block size错误
我想起来我是使用nginx来把请求发送给uwsgi。
所以uwsgi被配置成使用socket方式(为tcp协议)进行通信。如果打开浏览器访问uwsgi指定的端口,那么浏览器请求uwsgi的方式为http协议,而不是socket方式。所以就导致uwsgi的log文件中打出上面的错误信息。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^