Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.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
在运行Sophos的机器上,为什么我的所有浏览器都无法实时从我的Python应用程序接收服务器发送的事件(sse)?_Python_Python Asyncio_Server Sent Events_Antivirus_Asgi - Fatal编程技术网

在运行Sophos的机器上,为什么我的所有浏览器都无法实时从我的Python应用程序接收服务器发送的事件(sse)?

在运行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应用程序(作用域、接收、发送): 标题=[

我的ASGI应用程序将事件发送到curl和我的手机。然而,即使服务器正在发送事件,并且标题看起来正确,在连接关闭之前,我的Windows机器上的Firefox和Chrome都不会接收事件

无论是在WSL、Powershell终端还是在单独的Linux设备上托管服务器,都会发生这种情况

但是,如果我托管了,这些浏览器也可以正常工作(请将其分叉并试用)

我试过摆弄Windows防火墙设置,但没有用

以下是应用程序代码:

导入异步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保护会缓冲和扫描文本/事件流内容,以查找恶意软件。因此出现了意外的缓冲

解决方案 我发现有两种变通方法:

  • 在第一个事件之前发送一个2兆字节的数据块(越大越好,越小越好)。您不需要在每次活动中都发送此消息;就第一个
  • 或者使用https(SSL/TLS)。对于本地开发,考虑使用一种方便的方法来设置这个。
  • 巨蟒之谜 上述问题不仅仅是我的代码的问题,也不是Uvicorn、Hypercorn或ASGI的问题。事实上,我甚至尝试了一个aiohttp实现,结果也一样糟糕。然而,当我尝试SSE时,它运行良好,不需要任何变通方法。我能看到的唯一区别是Go实现在每个事件之后都使用了flush方法。我不确定为什么ASGI和aiohttp不公开某种刷新方法,或者,如果他们公开了,为什么我找不到它。如果他们这样做了,会不会使这些变通办法变得不必要?我不确定

    以下是使其与Sophos协同工作的更新代码,并检查是否通过https提供服务:

    异步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}) 如果范围[“方案”]!=“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