我想在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模板中呈现大型日志文件。为此,模板将呈现由生成器提供的各行,生成器从磁盘流式传输日志文件。模板渲染只是停止...
[我找到了一种方法,但是在此过程中意识到尝试在浏览器中显示大日志文件是一个坏主意,因为其中一些确实很大。
[如果有人尝试这样做(文件稍小一些),请注意,模板从根本上是同步呈现的,因此上述方法实际上不起作用。