在上下文中使用大型生成器流式处理Django模板

问题描述 投票:0回答:1

我想在Django模板中呈现大型日志文件。

为此,模板呈现由生成器提供的各行,生成器从磁盘流式传输日志文件。

虽然模板渲染会在一段时间后停止,但我不确定我哪里出错了。

我的Django应用正在使用gunicorn和nginx(在下面的配置中运行。)>

我可以看到已经设置了相关的响应头,所以我不知道为什么日志在以下时间停止渲染约30-40秒:

HTTP/1.1 200 OK
Server: nginx/1.17.4
Date: Wed, 12 Feb 2020 12:53:43 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Frame-Options: SAMEORIGIN

模板的相关部分:

<div class="log-body">
{% for line in log %}
  {{ line }}
{% endfor %}
</div>

views.py中的渲染功能>

def render_log(request):
    log = read_log_file_gen("some_path.log")

    if not log:
        log = ["No logs found"]

    template = loader.get_template('show_log.html')
    context = {
        'log': log,
    }

    return StreamingHttpResponse(template.render(context, request))

def read_log_file_gen(path):
    _256KB = 256 * 1024
    try:
        with open(path) as f:
            while True:
                lines = f.readlines(_256KB)
                if not lines:
                    break
                yield "".join(lines)
    except IOError:
        return None

该应用程序通过docker-compose运行:

version: '3'

services:
  web:
    build: ./app
    command: gunicorn app.wsgi:application --bind 0.0.0.0:8000 -k gevent
    volumes:
      - static_volume:/usr/src/app/static
      - /var/run/docker.sock:/var/run/docker.sock
      - /mnt/data:/mnt/data
    expose:
      - 8000
    env_file:
      - ./env/.env.prod
  nginx:
    build: ./nginx
    volumes:
      - static_volume:/usr/src/app/static
    ports:
      - 8888:80
    depends_on:
      - web

volumes:
  static_volume:

我想在Django模板中呈现大型日志文件。为此,模板将呈现由生成器提供的各行,生成器从磁盘流式传输日志文件。模板渲染只是停止...

django streaming gunicorn
1个回答
0
投票

[我找到了一种方法,但是在此过程中意识到尝试在浏览器中显示大日志文件是一个坏主意,因为其中一些确实很大。

[如果有人尝试这样做(文件稍小一些),请注意,模板从根本上是同步呈现的,因此上述方法实际上不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.