在运行Sophos的机器上,为什么我的所有浏览器都无法实时从我的Python应用程序接收服务器发送的事件(sse)?
我的ASGI应用程序将事件发送到curl和我的手机。然而,即使服务器正在发送事件,并且标题看起来正确,在连接关闭之前,我的Windows机器上的Firefox和Chrome都不会接收事件 无论是在WSL、Powershell终端还是在单独的Linux设备上托管服务器,都会发生这种情况 但是,如果我托管了,这些浏览器也可以正常工作(请将其分叉并试用) 我试过摆弄Windows防火墙设置,但没有用 以下是应用程序代码:在运行Sophos的机器上,为什么我的所有浏览器都无法实时从我的Python应用程序接收服务器发送的事件(sse)?,python,python-asyncio,server-sent-events,antivirus,asgi,Python,Python Asyncio,Server Sent Events,Antivirus,Asgi,我的ASGI应用程序将事件发送到curl和我的手机。然而,即使服务器正在发送事件,并且标题看起来正确,在连接关闭之前,我的Windows机器上的Firefox和Chrome都不会接收事件 无论是在WSL、Powershell终端还是在单独的Linux设备上托管服务器,都会发生这种情况 但是,如果我托管了,这些浏览器也可以正常工作(请将其分叉并试用) 我试过摆弄Windows防火墙设置,但没有用 以下是应用程序代码: 导入异步IO 导入日期时间 异步def应用程序(作用域、接收、发送): 标题=[
导入异步IO
导入日期时间
异步def应用程序(作用域、接收、发送):
标题=[(b“内容类型”,b“文本/html”)]
如果作用域[“路径”]==“/”:
正文=(
""
""
""
""
“让eventSource=neweventsource('/sse');”
eventSource.addEventListener('消息',(e)=>{
“document.body.innerHTML+=e.data+'
”
" });"
""
""
).encode()
等待发送({“type”:“http.response.start”,“status”:200,“headers”:headers})
等待发送({“类型”:“http.response.body”,“body”:body})
elif作用域[“路径”]=“/sse”:
标题=[
(b“内容类型”,b“文本/事件流”),
(b“缓存控制”,b“无缓存”),
(b“连接”,b“保持活动”),
]
异步def body():
进行中=正确
在进行中:
尝试:
有效负载=datetime.datetime.now()
产生f“数据:{payload}\n\n”.encode()
等待异步睡眠(10)
除asyncio.Cancelled错误外:
进行中=错误
等待发送({“type”:“http.response.start”,“status”:200,“headers”:headers})
body()中块的异步:
等待发送({“type”:“http.response.body”,“body”:chunk,“more_body”:True})
等待发送({“类型”:“http.response.body”,“body”:b”“})
其他:
等待发送({“type”:“http.response.start”,“status”:404,“headers”:headers})
等待发送({“类型”:“http.response.body”,“body”:b”“})
可以将上面的文件命名为asgi_sse.py
,然后pip install uvicorn
,然后使用
uvicorn asgi_sse:app
(将上面的uvicorn
替换为daphne
或hypercorn
,查看这些服务器如何处理应用程序。)
标题:
$curl-Ihttp://localhost:8000/sse
HTTP/1.1200ok
日期:2020年6月1日星期一09:51:41 GMT
服务器:uvicorn
内容类型:文本/事件流
缓存控制:没有缓存
连接:保持活力
答复如下:
$curlhttp://localhost:8000/sse
数据:2020-06-01 05:52:40.735403
数据:2020-06-01 05:52:50.736378
数据:2020-06-01 05:53:00.736812
欢迎有任何见解 解释
我的公司已启用Sophos Endpoint Security的web保护。根据,web保护会缓冲和扫描文本/事件流内容,以查找恶意软件。因此出现了意外的缓冲
解决方案
我发现有两种变通方法:
” " });" "" "" ).encode() 等待发送({“type”:“http.response.start”,“status”:200,“headers”:headers}) 等待发送({“类型”:“http.response.body”,“body”:body}) elif作用域[“路径”]=“/sse”: 标题=[ (b“内容类型”,b“文本/事件流”), (b“缓存控制”,b“无缓存”), (b“连接”,b“保持活动”), ] 异步def body(): 进行中=正确 在进行中: 尝试: 有效负载=datetime.datetime.now() 产生f“数据:{payload}\n\n”.encode() 等待异步睡眠(10) 除asyncio.Cancelled错误外: 进行中=错误 等待发送({“type”:“http.response.start”,“status”:200,“headers”:headers}) 如果范围[“方案”]!=“https”:#Sophos将缓冲,因此先发送2MB 两个磁块=“.”*2048**2 待发( { “类型”:“http.response.body”, “body”:f:{two_meg_chunk}\n\n“。encode(), “更多的身体”:没错, } ) body()中块的异步: 等待发送({“type”:“http.response.body”,“body”:chunk,“more_body”:True}) 等待se