【问题标题】:How is a text file sent to a browser line by line文本文件如何逐行发送到浏览器
【发布时间】:2012-10-26 21:51:21
【问题描述】:

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

我认为 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 %}

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

谢谢

【问题讨论】:

  • 事实是,客户端收到后试图从服务器端修改网页,基本上是不可能的。可能有一个 JS 解决方法,但事实是检索网页是一次性的。
  • 我遇到的问题是服务器如何通过某种持久连接继续向客户端推送数据,甚至接收实时数据。
  • 目前您的服务看起来像您期望的 JSON,JSON 在完全传输之前无法使用。一次传输所有 json 时浏览器是否挂起?
  • “我有一个文本文件,想逐行发送到网络浏览器”... 为什么?你想在这里完成什么?您只是想在完全下载之前对其进行部分渲染吗?

标签: javascript jquery python web-applications flask


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我使用了 WebSockets 和 Tornado,这似乎写出了这些行。它似乎也在向客户端浏览器发送实时数据,这是我希望它做的。
【解决方案2】:

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

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

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

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

  1. 浏览器打开 - Javascript 要求输入第 1 行
  2. Python 服务器启动,发送第 1 行
  3. 浏览器收到第一行 - Javascript 要求第二行...等
  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);

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-18
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多