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>
我有一个基本的烧瓶应用程序,用于从 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>