有没有办法将文件解析为 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>