使用Python cgi脚本在CGIHTTPServer上实现HTML5服务器发送事件

3
我正在测试HTML5服务器发送事件,看是否可以在我的项目中使用。我尝试按照http://www.html5rocks.com/en/tutorials/eventsource/basicshttp://www.w3schools.com/html/html5_serversentevents.asp上的教程进行操作,但无法使其工作。

这是我的HTML(sse.html)和Python CGI脚本(sse.py):
<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">
   var source = new EventSource("/cgi-bin/sse.py");
   source.onmessage = function(event) {
       console.log(event.data);
   };
</script>
</head>
<body>
Testing SSE!
</div>
</body>
</html>

以下是 sse.py 文件内容:
import sys
import datetime
import time

sys.stdout.write('Content-type: text/event-stream\r\n\r\n')

while True:
   now = datetime.datetime.now()
   sys.stdout.write('data: %s\r\n\r\n' % now)
   sys.stdout.flush()
   time.sleep(5)

我将'sse.html'放入'c:\code\sse'文件夹中,将'sse.py'放到'c:\code\sse\cgi-bin'文件夹中。然后,我运行了'python -m CGIHTTPServer'来启动开发 Web 服务器。
当我连接到'http://localhost:8000/sse.html'时,我没有看到控制台记录从服务器接收的数据。相反,我看到了一条消息,上面写着"Resource interpreted as Script but transferred with MIME type text/plain: "chrome-extension://hgimnogjllphhhkhlmebbmlgjoejdpjl/bar.js"."。
有人知道问题出在哪里吗?
谢谢!
1个回答

2

我通过反复尝试修改了'sse.py',现在代码可以正常运行。 新的'sse.py'如下:

import sys
import datetime
import time

sys.stdout.write('Content-type: text/event-stream \r\n\r\n')
now = datetime.datetime.now()
sys.stdout.write('data: %s \r\n' % now)
sys.stdout.write('retry: 1000\r\n\r\n')
sys.stdout.flush()

我仍在努力理解事物的运作方式。


我不确定“retry”字段是否解决了您的问题。但请确保响应以UTF-8编码,并相应地设置内容类型标头为“text/event-stream; charset=utf-8”。 - Donghwan Kim
"retry" 用于设置客户端再次访问脚本的时间间隔。如果我将设置“retry”间隔的语句删除,并在上面的语句中添加一个“\r\n”,代码仍然可以工作,但时间间隔将变为3秒。我不理解的是,根据我的阅读,似乎我们只需要设置一次内容类型,客户端就会始终等待带有“data:”前缀的消息。但修改后的代码显示,似乎我们需要为每个消息指定内容类型。 - Victor Gau
我不懂Python,所以无法给你一个清晰的答案,但显然有些地方出了问题。作为实时Web应用程序框架Cettia的作者,我从未在处理服务器发送事件时使用过重试字段。因为你似乎打印原始的HTTP消息,而不像你所读到的(他们使用框架而不是直接处理HTTP消息行),我怀疑你应该遵循分块传输编码 - Donghwan Kim
然后,符合Server-Sent事件规范的HTTP响应右侧普通消息将如下所示此处。参见“客户端接收服务器数据的HTTP请求/响应”部分。顺便提一句,Vibe是Cettia的以前的名称。 - Donghwan Kim
我认为你需要查找nph脚本。 - ijw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接