Ajac调用被阻止 - Web2py Framework

时间:2013-02-03 08:49:54

标签: python ajax jquery web2py web2py-modules

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

  • 在您的应用代码中,当有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)。这将阻止框架自动连接该路由的会话(您仍然可以在应用程序代码中手动连接会话)。从理论上讲,这比第一个选项更有效,因为它可以防止会话文件被锁定(使用第一个选项,框架仍然最初锁定会话文件,然后您的应用程序代码稍后将其解锁)