我不希望用户等待到脚本完全结束,因为这样所有的输出都会一次性显示出来。我也尝试过这样做,但是连接总是超时。
我不知道这个过程被称为什么,我在寻找哪些术语以及我需要使用什么。CGI?Ajax?需要严格的指导,谢谢!
如果重要的话,我计划使用Nginx作为Web服务器。
解决方案是在脚本执行的某些关键点上刷新输出缓冲区 - 我只在 PHP 中通过 flush() 实现过这一点,但这似乎是 Python 的等效方法:
cgiprint() 也使用 sys.stdout.flush() 刷新输出缓冲区。大多数服务器会将脚本的输出缓冲起来直到完成。对于长时间运行的脚本,缓冲输出可能会让用户感到沮丧,不知道发生了什么。您可以定期刷新缓冲区,或者以非缓冲模式运行 Python。命令行选项是 -u,您可以在 shebang 行中指定为
#!/usr/bin/python -u
。
正如其他人建议的那样,您可以使用保持连接和yield语句代替“return”语句以及使用yield语句代替“print”语句。这将基本上显示python脚本中发生的一切到网站页面。
经过广泛的搜索和测试,我建议使用nginx作为反向代理,gevent和bottle作为后端,这样可以放心,因为nginx永远不会提供python源文件。
来自http://tools.cherrypy.org/wiki/Comet的内容:
维基百科描述Comet为“一种新词,用于描述一种Web应用程序模型,其中长时间保持的HTTP请求允许Web服务器向浏览器推送数据,而无需浏览器明确请求。”。换句话说,Comet是您构建非常花哨的AJAX应用程序所需的异步Javascript技巧。
以下代码演示了如何使用CherryPy和jQuery编写Comet应用程序。它是控制台ping命令的Web界面。选择ping命令作为示例是因为如果不给出参数,它将无限期运行。在Web应用程序编程中执行永无止境的命令通常是大忌,但是使用CherryPy,我们可以轻松处理这个问题:请参见链接。
我正在尝试做完全相同的事情。到目前为止,我正在使用cherrypy,因为它很容易与我的脚本集成。