0

我有一个在主机 A 上运行的网络应用程序,它在另一台主机 B 上运行一些命令,我​​想在 A 上的网页上显示在 B 上运行的命令的输出,即我想创建一种实时在 A 上的网页上流式传输 B 的控制台。

为此,我将 B 控制台的输出重定向到 A 上的套接字,并将输出保存在 A 上的文件中。

我触发了一个 ajax 调用,该调用启动了从 B 开始的进程(使用 web2py 控制器)。这个 ajax 调用还处理了 B 的控制台到 A 的套接字的重定向。

从网页中,我触发了另一个 ajax,它读取存储套接字数据的文件。

现在我面临的问题是,当我触发 secodn ajax 调用时,它不会返回网页,直到返回第一个 ajax 调用。

我想知道这是正确的做法。我也想知道,我面临的问题是由于 ajax 或 web2py 框架?

4

1 回答 1

2

默认情况下,会话文件在每次请求时都会被锁定,因此来自同一客户端的新请求会被阻止,直到前一个请求完成并且会话文件被解锁(请参阅此处)。要避免此问题,您可以执行以下操作之一:

  • 在您的应用程序代码中,当请求 Ajax 函数时,立即调用session.forget(response). 这将解锁会话文件(并因此阻止为该请求保存会话)。您可以在 Ajax 函数本身的开头包含这一行,也可以在模型文件的前面包含它:

    if request.function in [list, of, ajax, functions]:
        session.forget(response)
    
  • 将会话存储在数据库或 cookie 中,在这种情况下,不会有要锁定的会话文件。

  • 如果您不使用基于参数的重写系统,您可以使用基于模式的重写系统来禁用特定路由的自动会话连接。在 routes_in 中,您可以指定 3 元组,而不是指定标准的 2 元组。元组的前两个元素和往常一样(传入模式和重写模式),第三个元素应该是dict(web2py_disable_session=True). 这将阻止框架自动连接该路由的会话(您仍然可以在应用代码中手动连接会话)。从理论上讲,这比第一个选项更有效,因为它完全防止会话文件被锁定(使用第一个选项,框架仍然最初锁定会话文件,然后您的应用程序代码稍后将其解锁) .
于 2013-02-03T14:20:27.660 回答