当前位置: 首页 > 面试题库 >

只要服务器上有数据,就在网页上显示结果

巴洲
2023-03-14
问题内容

我正在用Python编写cgi页面。假设某个客户向我的cgi页面发送了请求。我的cgi页会进行计算,并在获得第一个输出后立即将其发送回客户端,但是它将
继续 进行计算并在发送第一个响应 发送其他响应。

我在这里介绍的内容可能吗?我之所以问这个问题,是因为据我所知,在cgi页面中,响应是一次性发送回去的,一旦发送响应,cgi-
page就会停止运行。这个东西是在服务器端或客户端制作的,我该如何实现?

我的服务器正在运行Apache。非常感谢你。

我已经在该论坛上尝试了来自“ dbr”的客户端代码(由于他,我有了长轮询有效的想法)。

<html>
<head>
    <title>BargePoller</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript" charset="utf-8"></script>

    <style type="text/css" media="screen">
      body{ background:#000;color:#fff;font-size:.9em; }
      .msg{ background:#aaa;padding:.2em; border-bottom:1px #000 solid}
      .old{ background-color:#246499;}
      .new{ background-color:#3B9957;}
    .error{ background-color:#992E36;}
    </style>

    <script type="text/javascript" charset="utf-8">
    function addmsg(type, msg){
        /* Simple helper to add a div.
        type is the name of a CSS class (old/new/error).
        msg is the contents of the div */
        $("#messages").append(
            "<div class='msg "+ type +"'>"+ msg +"</div>"
        );
    }

    function waitForMsg(){
        /* This requests the url "msgsrv.php"
        When it complete (or errors)*/
        $.ajax({
            type: "GET",
            url: "msgsrv.php",

            async: true, /* If set to non-async, browser shows page as "Loading.."*/
            cache: false,
            timeout:50000, /* Timeout in ms */

            success: function(data){ /* called when request to barge.php completes */
                addmsg("new", data); /* Add response to a .msg div (with the "new" class)*/
                setTimeout(
                    'waitForMsg()', /* Request next message */
                    1000 /* ..after 1 seconds */
                );
            },
            error: function(XMLHttpRequest, textStatus, errorThrown){
                addmsg("error", textStatus + " (" + errorThrown + ")");
                setTimeout(
                    'waitForMsg()', /* Try again after.. */
                    "15000"); /* milliseconds (15seconds) */
            },
        });
    };

    $(document).ready(function(){
        waitForMsg(); /* Start the inital request */
    });
    </script>
</head>
<body>
    <div id="messages">
        <div class="msg old">
            BargePoll message requester!
        </div>
    </div>
</body>
</html>

这是我的服务器代码:

import sys
if __name__ == "__main__":
    sys.stdout.write("Content-Type: text/html\r\n\r\n")
    print "<html><body>"
    for i in range(10):
        print "<div>%s</div>" % i
        sys.stdout.flush()
    print "</body></html>"

我希望我的客户页面一次显示1个数字(0,1,2,…),但是数据总是一次全部显示出来(01234 …)。请帮我弄清楚。非常感谢你们。

只是有点偏离轨道,我尝试使用jquery Comet插件,但是我找不到足够的文档。帮助将不胜感激。再次感谢:D

[编辑]好的,最后,感谢您的指导,我设法使它起作用。当您预测mod_deflate是所有这些源头时,您是对的。

总结一下,我在这里做了什么:

  • 对于客户端,将较长的民意调查页面作为上面的html代码

  • 对于服务器,通过以下方法禁用mod_deflate:编辑文件/etc/apache2/mods-available/deflate.conf,用text / html部分注释掉该行,然后重新启动服务器。为确保Python自身不缓冲输出,请在页面开头添加#!/ usr / bin / python -u。记住,要在客户端出现每一次打印后,都要使用sys.stdout.flush()。效果可能不是透明的,应包括time.sleep(1)进行测试。:D

非常感谢你们支持和帮助解决这个问题:D


问题答案:

当然。

有传统的服务器驱动方法,其中脚本仅运行一次,但要花很长时间才能完成,因此会随即吐出部分页面:

import sys, time

sys.stdout.write('Content-Type: text/html;charset=utf-8\r\n\r\n')

print '<html><body>'
for i in range(10):
    print '<div>%i</div>'%i
    sys.stdout.flush()
    time.sleep(1)

当将应用程序写入WSGI时,这是通过使应用程序返回一个可迭代程序来完成的,该程序输出一次要分别发送的每个要发送的块。我真的建议写WSGI。您现在可以通过CGI部署它,但是将来当您的应用需要更好的性能时,您可以通过更快的服务器/界面来部署它,而无需重写。

WSGI-over-CGI示例:

import time, wsgiref.handlers

class MyApplication(object):
    def __call__(self, environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html;charset=utf-8')])
        return self.page()

    def page(self):
        yield '<html><body>'
        for i in range(10):
            yield '<div>%i</div>'%i
            time.sleep(1)

application= MyApplication()
if __name__=='__main__':
    wsgiref.handlers.CGIHandler().run(application)

请注意,您的Web服务器可能会通过添加其自身的缓冲来阻止这种方法(对于CGI
WSGI)。如果您使用输出转换过滤器(例如mod_deflate自动压缩Webapp输出),通常会发生这种情况。您需要为生成部分响应的脚本关闭压缩。

这限制了您在输入新数据时逐位渲染页面。您可以通过让客户端在输入新数据时照顾更改页面来使其更漂亮,例如:

def page(self):
    yield (
        '<html><body><div id="counter">-</div>'
        '<script type="text/javascript">'
        '    function update(n) {'
        '        document.getElementById("counter").firstChild.data= n;'
        '    }'
        '</script>'
    )
    for i in range(10):
        yield '<script type="text/javascript">update(%i);</script>'%i
        time.sleep(1)

这依赖于客户端脚本,因此最好在末尾包含基于非脚本的备份最终输出。

一直以来,页面似乎仍在加载中。如果您不希望这样做,则需要将脚本拆分为一个只发出静态内容的第一个请求,包括客户端脚本,该客户端脚本使用一个轮询新数据的XMLHttpRequest与服务器进行核对通过,或者对于真正长期运行的情况,很多XMLHttpRequests都返回状态和任何新数据。这种方法要复杂得多,因为这意味着您必须将工作流程作为后台守护进程运行(与Web服务器分开),并使用例如在守护程序和前端CGI
/ WSGI请求之间传递数据。管道或数据库。



 类似资料:
  • 我正在使用木偶人刮一个网站,有一个任务在特定的时间执行。我需要读取服务器时钟,这是张贴在页面上。页面上的时钟是不断变化的,我需要能够读取它,所以只要它显示“7:00:00 AM”,我的功能就会触发(不是一毫秒之前,否则我需要访问的页面将不会加载)。我也不想在早上7点以后等一秒钟,否则我可能订不到我的预约。 下面是我需要阅读的元素的html。当您在控制台中查看时,时间(html文本)会闪烁并不断变化

  • 我和我的几个伙伴正在进行国际足联联赛。我有一个服务器可以上传排行榜。现在我正在使用一个电子表格和公式来计算积分和目标差。非常简单的东西,但我不必改变一切,我只需要改变赢球、平局、输球和进球、失球。问题是,很多人用手机参与我们的在线聊天,而不能在手机上查看电子表格。 所以我要找的帮助是,我知道我可以创建一个html表,但是有没有我可以在其中包含公式的东西?

  • 问题内容: 我目前正在使用dropzone.js v3.10.2,但在显示已上传的现有文件时遇到问题。我比php更加胜任,但是关于ajax和js的知识却很有限 如果您能帮助的话,那太好了 提前致谢 index.php upload.php PS。我知道PHP正在检索数据 提前致谢 达米安 问题答案: 我检查了代码(来自starTutorial),它对我也不起作用(?) 我设法通过替换它来使其工作:

  • 当我在Eclipse中启动我的JavaEE 6应用程序时,一切都很好(所有日志都可以)。当我现在在完全相同的服务器上使用相同的应用程序时,但是部署并启动了IntelliJ,然后以下日志 像这样 IntelliJ中文件编码的源文件、项目和常规设置均设置为UTF-8。 我正在使用OSX Mavericks。

  • 当我试图在Eclipse v3.8中添加新服务器时,所有Apache Tomcat版本都列在选择服务器选项中,只有v8.0: 我检查了JST服务器适配器和JST服务器适配器扩展是否已经安装。 我需要Apache Tomcat v8.0,我该怎么做? PS:我用的是Xubuntu。

  • 看起来字体不适合我的旋转木马(或滑块)。我的计算机上没有安装它使用的字体。在我的本地测试服务器上,左右箭头和按钮工作良好。而在远程服务器上则没有。在远程,它甚至可能在使用另一种字体。匕首或十字形的字符不是“光滑”字体。我把它放在模板(Dreamweaver)页面的头部和我的自定义CSS文件中,以防在slick-theme.CSS文件中单独使用时出现问题:@font-face{font-family