服务器端:

from flask import Flask, request, Response, stream_with_context
import time

app = Flask(__name__)

# Define a route /stream that handles POST requests
@app.route('/stream', methods=['POST'])  # GET also been tried, no difference
def stream():
    @stream_with_context
    def generate():
        print('1')
        yield "Hello\n"
        time.sleep(1) # Simulate some delay
        print('2')
        yield "World\n"
        time.sleep(1)
        print('3')
        yield "This is\n"
        time.sleep(1)
        print('4')
        yield "Streaming data\n"
        time.sleep(1)
        print('5')

    return Response(generate(), content_type='text/event-stream')

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

客户端:

import requests
import sseclient

reqUrl = 'https://api.my-domain-name.com/stream'
headers={'Accept': 'text/event-stream'} 


# response = requests.get(url=reqUrl, headers=headers, stream=True)
response = requests.post(url=reqUrl, headers=headers, stream=True)

if response.status_code == 200:
    for chunk in response.iter_content(chunk_size=3):
        if chunk:
            print(chunk)
else:
    print('fail:', response.status_code)

# sse tried, no difference
# client = sseclient.SSEClient(response)
# for event in client.events():
#     print(event.data)

When client connected, there was 1 2 3 4 5 printed one by one at the server side.
But client printed nothing, until server finished, client printed all data. Help!

我已经try 了上面的代码,并try 了GET/POST,无论是否使用SSE. 当我try GET方法时,我也try 了curl-v命令,同样的结果,数据在大约5秒后聚集在一起,而不是一个接一个. 我预计流数据,即每个yield 率数据都可以单独及时处理,而不是一起处理.

推荐答案

原来是服务器设置的问题,10年前的this post确实有帮助. Nginx设置很重要.

现在服务器端还好,postman 在我的本地机器上测试过了,奇怪的是,客户端的代码不是串流的,它同时打印所有的数据. 我已try 复制postman 测试头,但没有帮助.

headers={
    'Accept': 'text/event-stream',
    # "Content-Type": "application/json", # in postman is this, tested no difference
    "Content-Type": "text/event-stream",
    "Transfer-Encoding": "chunked"  #tried, no help
    # below are copied from postman
    "Cache-Control":"no-cache",
    "Connection":"keep-alive",
    'Accept':'*/*',
    'User-Agent':'PostmanRuntime/7.32.3'
     } 

顺便说一句:客户端代码可以正确调用一些第三方流数据接口. 所以我很困惑,问题出在哪里.

更新:终于解决了这个问题. Sseclient和sseclient-py是不同的,我卸载了它们并只安装了一个,然后就好了.对于我来说,我使用了sseclient,并修改了一些代码,以使GET和POST都能正常工作.Sseclient也应该有效,但我还没有试过.(单纯try 仍有问题,需要调查)

Python相关问答推荐

Image Font生成带有条形码Code 128的条形码时出现枕头错误OSErsor:无法打开资源

列表上值总和最多为K(以O(log n))的最大元素数

Python在tuple上操作不会通过整个单词匹配

难以在Manim中正确定位对象

处理带有间隙(空)的duckDB上的重复副本并有效填充它们

根据二元组列表在pandas中创建新列

使用groupby Pandas的一些操作

解决调用嵌入式函数的XSLT中表达式的语法移位/归约冲突

从Windows Python脚本在WSL上运行Linux应用程序

AES—256—CBC加密在Python和PHP中返回不同的结果,HELPPP

pysnmp—lextudio使用next()和getCmd()生成器导致TypeError:tuple对象不是迭代器''

Polars map_使用多处理对UDF进行批处理

Python pint将1/华氏度转换为1/摄氏度°°

如何在Python Pandas中填充外部连接后的列中填充DDL值

如何在Python 3.9.6和MacOS Sonoma 14.3.1下安装Pyregion

在Python中控制列表中的数据步长

ModuleNotFoundError:Python中没有名为google的模块''

Pandas:将值从一列移动到适当的列

Polars时间戳同步延迟计算

大型稀疏CSR二进制矩阵乘法结果中的错误