返回文件列表的 Python 烧瓶应用

时间:2021-05-03 18:11:57

标签: python flask httpserver

我有一个基本的 Flask 应用程序,用于从 Pod 获取日志。我想在查询未完成时使用 send_from_directory。我不想创建 zip 文件并列出它,而是想列出查询生成的日志文件。

from flask import Flask, send_from_directory
from flask import request
import http.server
import socketserver
import subprocess
import os
import sys
from urllib.parse import urlparse
from urllib.parse import parse_qs

app = Flask(__name__)
# write route for a namespace completely
@app.route('/logs')
def hello_world():
umgebung = request.args.get('umgebung', None)
product = request.args.get('product', None)
product_type = request.args.get('product_type', None)
output = (subprocess.check_output(['cmd', '/c', f'oc logs --tail=-1 -n awl-{umgebung} -l product={product},type={product_type}'])).decode();
if not output:
    output_as = (subprocess.check_output(['cmd', '/c', f'oc logs --tail=-1 -n awl-{umgebung} -l product={product},type=as'])).decode();
    output_db = (subprocess.check_output(['cmd', '/c', f'oc logs --tail=-1 -n awl-{umgebung} -l product={product},type=db'])).decode();
    output_as_file = open ("logs/output_as_log.log","w")
    output_db_file = open ("logs/output_db_log.log","w")
    output_as_file.write(output_as)
    output_db_file.write(output_db)
    path= 'logs'
    return send_from_directory(path, output_as_file,as_attachment=True) #HERE I DO NOT UNDERSTNAD WHAT SHOUDL  BE GIVEN       
output = "<br />".join(output.split("\n"))   
return output

我正在项目文件夹内的日志文件夹下创建日志文件。如何显示文件夹 log 中的所有文件?这样就可以一键下载?

澄清投票结束!!

应用程序应返回特定文件夹中的文件。但是 send_fron_directory 没有按预期工作。

1 个答案:

答案 0 :(得分:1)

您可以使用 os.listdirglob.globpathlib library 列出所有文件。然后可以在模板中输出结果。
然后添加一个新路由,该路由将文件名作为参数,并通过 send_from_directory 从文件夹中传送文件。您可以将文件名作为 rule 中的路径传递。
就我对你的理解,下面的例子应该可以满足你的要求。

import os
from flask import Flask, render_template, send_from_directory

app = Flask(__name__)

@app.route('/logs/')
def logs():
    filenames = os.listdir('logs')
    return render_template('logs.html', files=filenames)

@app.route('/logs/<path:filename>')
def log(filename):
    return send_from_directory(
        os.path.abspath('logs'),
        filename,
        as_attachment=True
    )

应在应用程序目录中的 templates/logs.html 下添加以下模板。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Logfiles</title>
  </head>
  <body>
    <ul>
    {% for file in files %}
        <li><a href="{{ url_for('log', filename=file) }}">{{ file }}</a></li>
    {% endfor %}
    </ul>
  </body>
</html>