问题描述
我有一个基本的 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',type=as'])).decode();
output_db = (subprocess.check_output(['cmd',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
没有按预期工作。
解决方法
您可以使用 os.listdir、glob.glob 或 pathlib 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>