Python flask app 其中 returns 文件列表

Python flask app which returns list of files

我有一个基本的烧瓶应用程序,用于从 pods 获取日志。我想在查询未完成时使用 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 中的所有文件?以便一键下载?

最后投票的澄清!!

应用程序应该 return 来自特定文件夹的文件。但是 send_fron_directory 没有按预期工作。

您可以使用 os.listdir, glob.glob or the pathlib library 列出所有文件。然后可以在模板中输出结果。
然后添加一个新路由,该路由需要文件名作为参数,并通过 send_from_directory. You can pass the name of the file as a path within a 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>