8

鉴于,当用户/foo在我的服务器上请求时,我发送以下 HTTP 响应(不关闭连接):

Content-Type: multipart/x-mixed-replace; boundary=-----------------------

-----------------------
Content-Type: text/html

<a href="/bar">foo</a>

当用户转到/bar(将发送204 No Content,因此视图不会更改)时,我想在初始响应中发送以下数据。

-----------------------
Content-Type: text/html

bar

我如何从初始响应中获得第二个触发此请求的请求?我正计划创建一个花哨的 [支持 multipart/x-mixed-replace(目前只有 Gecko)的引擎]-仅用于执行服务器推送和 Ajax 效果的电子邮件 web 应用程序,而无需任何 JavaScript,只是为了好玩。

4

4 回答 4

1

如果问题是将一些命令从 /bar 应用程序传递到 /foo 应用程序,并且您正在使用一些类似 servlet 的方法(Python 代码只加载一次,而不是像在 CGI 中那样为每个请求加载),您只需更改一些类属性/foo 应用程序并准备好对 /foo 实例中的更改做出反应(通过检查属性状态)。

显然 /foo 应用程序不应该在第一个请求之后立即返回并逐行产生内容。

以为这只是理论,我自己没有尝试过。

于 2010-04-05T08:50:01.353 回答
1

没有完整的答案,但是:

在您的问题中,您描述的是Comet风格的架构。关于在 Python/WSGI 中对 Comet 风格技术的支持,有一个StackOverflow 问题,它讨论了支持长时间运行请求的各种 Python 服务器,例如 Comet。

Python Web-SIG 中的这个邮件线程也很有趣:“WSGI 可以处理异步响应吗?” . 2008 年 5 月,Web-SIG 就WSGI 中的异步请求主题进行了广泛的讨论。

最近的一个开发是evserver,一个轻量级的 WSGI 服务器,它实现了Christopher Stawarz 在 2008 年 5 月在 Web-SIG 中提出的异步 WSGI 扩展。

最后,Tornado Web 服务器支持非阻塞异步请求。它有一个使用长轮询的聊天示例应用程序,它与您的要求有相似之处。

于 2010-04-20T14:23:21.453 回答
1

我创建了一些小例子(只是为了好玩,你知道 :))

import threading

num = 0
cond = threading.Condition()

def app(environ, start_response):
    global num

    cond.acquire()
    num += 1
    cond.notifyAll()
    cond.release()

    start_response("200 OK", [("Content-Type", "multipart/x-mixed-replace; boundary=xxx")])
    while True:
        n = num    
        s = "--xxx\r\nContent-Type: text/html\r\n\r\n%s\n" % n
        yield s
        # wait for num change:
        cond.acquire()
        while num == n:
            cond.wait()
        cond.release()


from cherrypy.wsgiserver import CherryPyWSGIServer
server = CherryPyWSGIServer(("0.0.0.0", 3000), app)

try:
    server.start()
except KeyboardInterrupt:
    server.stop()

# Now whenever you visit http://127.0.0.1:3000/, the number increases.
# It also automatically increases in all previously opened windows/tabs.

共享变量和线程同步(使用条件变量对象)的思想是基于 CherryPyWSGIServer 提供的 WSGI 服务器是线程化的。

于 2010-04-20T15:16:46.973 回答
-1

不确定这是否正是您要寻找的,但是有一种相当古老的方式来使用 multipart/x-mixed-replace 的 mime 内容进行服务器推送

基本上,您将响应组合为内容类型为 multipart/x-mixed-replace 的 mime 对象,并向下发送文档的第一个“版本”。浏览器将保持套接字打开。

然后,当服务器决定推送更多数据时,从服务器发送文档的新“版本”,浏览器将智能地替换(在包含内容的任何框架/iframe 内)内容。

这是一种早期的网络摄像头方式,服务器会一个接一个地发送(推送)图像,而浏览器只会不断地替换文档中的图像。这也是通过单个 HTTP 请求执行“正在加载...”消息的一种方式。

于 2010-04-05T16:40:28.990 回答