有没有办法将文件解析为 HTML 中的 <source> 标记
Is there a way to parse a file through to a <source> tag in HTML
我正在尝试创建一个私人文件主机,我将其设置为 return a send_file(),例如 /media/someSong.mp3
url被调用。
但我想让它更有风格,所以当您访问 /media/someSong.mp3
时,您的浏览器不会尝试在其中播放该 MP3,它会使用带有解析标签的 HTML 页面send_file() 由参数发送。
目前,我有这个:
@app.route('/media/<mediaID>')
def mediaStuff(mediaID):
try:
return render_template('parse-it.html', title=title, media_file=send_file(f'./media/{mediaID}'))
# return send_file(f'./media/{mediaID}')
except FileNotFoundError:
return 'The media you tried to view doesn\'t exist.'
这是我的 templates/parse-it.html
文件中的内容:
{% extends "base.html" %}
{% block content %}
<h1>You are now viewing ...!</h1>
<source src={{media_file}}>
{% endblock %}
但是我看到的只是 或类似的东西。没有文件可看!
我会在 media_file 参数中使用 get_file() 然后 return Response(getfileVar) 吗?
send_file
returns a Response
对象。将其传递给模板没有任何意义。
所以你需要两个端点。一种用于显示包含媒体元素的网站,另一种用于从目录流式传输文件。我建议为此使用 send_from_directory
。
这是一个简单的示例,它列出了目录中的所有文件并提供它们以供播放或查看。区别是根据文件的 MIME 类型进行的。这是通过 guess_type
.
确定的
该示例使用 instance path 来确保文件和应用程序的分离。
import os
from flask import (
Flask,
render_template,
send_from_directory
)
from mimetypes import guess_type
app = Flask(__name__)
app.config['MEDIA_FOLDER'] = os.path.join(app.instance_path, 'media')
try:
os.makedirs(app.config['MEDIA_FOLDER'])
except:
pass
def listfiles(target):
for filename in os.listdir(target):
mimetype = guess_type(os.path.join(target, filename))
yield (
filename,
mimetype,
)
@app.route('/')
def index():
files = listfiles(app.config['MEDIA_FOLDER'])
return render_template('index.html', **locals())
@app.route('/media/<path:filename>')
def media(filename):
return send_from_directory(
app.config['MEDIA_FOLDER'],
filename
)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
{% for filename, type in files -%}
<div>
{% set mimetype, encoding = type -%}
{% if mimetype.startswith('audio') -%}
<audio controls>
<source src="{{ url_for('media', filename=filename) }}" type="{{ mimetype }}">
</audio>
{% elif mimetype.startswith('image') -%}
<img src="{{ url_for('media', filename=filename) }}" />
{% endif -%}
</div>
{% endfor -%}
</body>
</html>
我正在尝试创建一个私人文件主机,我将其设置为 return a send_file(),例如 /media/someSong.mp3
url被调用。
但我想让它更有风格,所以当您访问 /media/someSong.mp3
时,您的浏览器不会尝试在其中播放该 MP3,它会使用带有解析标签的 HTML 页面send_file() 由参数发送。
目前,我有这个:
@app.route('/media/<mediaID>')
def mediaStuff(mediaID):
try:
return render_template('parse-it.html', title=title, media_file=send_file(f'./media/{mediaID}'))
# return send_file(f'./media/{mediaID}')
except FileNotFoundError:
return 'The media you tried to view doesn\'t exist.'
这是我的 templates/parse-it.html
文件中的内容:
{% extends "base.html" %}
{% block content %}
<h1>You are now viewing ...!</h1>
<source src={{media_file}}>
{% endblock %}
但是我看到的只是
我会在 media_file 参数中使用 get_file() 然后 return Response(getfileVar) 吗?
send_file
returns a Response
对象。将其传递给模板没有任何意义。
所以你需要两个端点。一种用于显示包含媒体元素的网站,另一种用于从目录流式传输文件。我建议为此使用 send_from_directory
。
这是一个简单的示例,它列出了目录中的所有文件并提供它们以供播放或查看。区别是根据文件的 MIME 类型进行的。这是通过 guess_type
.
确定的
该示例使用 instance path 来确保文件和应用程序的分离。
import os
from flask import (
Flask,
render_template,
send_from_directory
)
from mimetypes import guess_type
app = Flask(__name__)
app.config['MEDIA_FOLDER'] = os.path.join(app.instance_path, 'media')
try:
os.makedirs(app.config['MEDIA_FOLDER'])
except:
pass
def listfiles(target):
for filename in os.listdir(target):
mimetype = guess_type(os.path.join(target, filename))
yield (
filename,
mimetype,
)
@app.route('/')
def index():
files = listfiles(app.config['MEDIA_FOLDER'])
return render_template('index.html', **locals())
@app.route('/media/<path:filename>')
def media(filename):
return send_from_directory(
app.config['MEDIA_FOLDER'],
filename
)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
{% for filename, type in files -%}
<div>
{% set mimetype, encoding = type -%}
{% if mimetype.startswith('audio') -%}
<audio controls>
<source src="{{ url_for('media', filename=filename) }}" type="{{ mimetype }}">
</audio>
{% elif mimetype.startswith('image') -%}
<img src="{{ url_for('media', filename=filename) }}" />
{% endif -%}
</div>
{% endfor -%}
</body>
</html>