0

我有一个文本文件,想将其逐行发送到 Web 浏览器。因此,当每一行被读取时,它都会在浏览器中输出。

我认为 JQuery 将是采用的路线,但我从未使用过它,因为客户端需要保持连接打开以接收我将发送的 (1000s) 行。

这意味着我不确定如何呈现 html/javascript 页面。这是我的 python 服务器代码:

from flask import Flask,render_template, request

app = Flask(__name__)


@app.route('/_reader')
def reader():
    f = open('/home/ranjeev/Desktop/sample_tweets.dat', 'rb')
    for line in f:
        print line
    return line

@app.route('/')
def index():
    return render_template('index.html')

if __name__ == '__main__':
    app.run(debug=True, port= 8888)

还有我的html代码:

{% extends "layout.html" %}
{% block body %}
<script type=text/javascript>
  $(function() {
      $.getJSON($SCRIPT_ROOT + '/_reader', 
       function(data) {
        $("#result").text(data.result);
});
      return false;
    });

</script>
<h1>Coordinates</h1>
<p>
   <span id=result>?</span>
{% endblock %}

我真的很感激帮助,因为这似乎是一个非常复杂的问题,我认为它不应该是这样。

谢谢

4

3 回答 3

2

WebSockets 适合这里:http ://en.wikipedia.org/wiki/WebSocket

这将允许您将内容发送回浏览器,使用 JS 获取它并继续在那里处理。

于 2012-11-06T21:27:13.860 回答
1

我不知道python,所以这将是相当高的水平,但这都是关于客户端-服务器关系的。

浏览器连接不会表现得像一个开放端口。它期望发出请求,并获得 HTTP 结构化响应。HTTP 中没有“流式传输”。

也就是说,通过控制等式的两端,您可以伪造它。这与 JQuery 无关,尽管他们的 AJAX 库可能有用,但不是必需的。

为此,您将每一行视为一个单独的 AJAX 请求。按顺序执行此操作还不错。您的请求将如下所示:

  1. 浏览器打开 - Javascript 要求第 1 行
  2. Python 服务器启动,发送第 1 行
  3. 浏览器收到第一行 - Javascript 要求第 2 行...等
  4. 服务器发送文档结束通知,浏览器停止请求行。

使用 Javascript 完成此任务的绝对最基本的方法如下,我假设您的服务器正在发送 json 对象并将它们编码为 {'number':'value','line':'value'},并且它正确响应格式为 yourServer/yourService/lineNumber 的 restful 请求

var loginUrl = "http://yourServer/yourService/"
var doRequestLine = function(lineNumber){
$.getJSON(loginUrl+lineNumber, function (data) {
               $(document.body).append($("<p>"+data.line+"</p>"))
               if(data.number === "end"){return;}
               doRequestLine(data.number++);
});
} 

doRequestLine(0);
于 2012-11-06T21:38:20.587 回答
1

在使用的时候XMLHttpRequest,可以.responseText在它还在加载的时候读取,就会得到目前已经加载的数据。(您可能想检查末尾是否有部分线,如果有,请将其切断)。

最新标准规定,只要收到更多数据就会XMLHttpRequest触发一个progress事件,因此您可以侦听该事件并呈现新数据。不幸的是, Mozilla FirefoxIE都没有实现该progress事件,因此您只需设置一个计时器并.responseText从该计时器进行检查。

在服务器端,您根本不需要任何花哨的东西;只需发送原始文本。(即使只是让 Web 服务器提供 .txt 文件也可以)。

于 2012-11-06T21:39:37.863 回答