Я нашел этот фрагмент кода:
from flask import Flask
import flask
from os import listdir
import os.path
import pathlib
import ntpath
app = Flask(__name__)
@app.route('/', defaults={'req_path': ''})
@app.route('/<path:req_path>')
def dir_listing(req_path):
BASE_DIR = 'D:/Users/xxx/projects/project1/static'
# Joining the base and the requested path
abs_path = os.path.join(BASE_DIR, req_path)
# Return 404 if path doesn't exist
if not os.path.exists(abs_path):
return flask.abort(404)
# Check if path is a file and serve
if os.path.isfile(abs_path):
return flask.send_file(abs_path)
# Show directory contents
files = os.listdir(abs_path)
for i, f in enumerate(files):
files[i] = os.path.join(req_path, f).replace('\\', '/')
return flask.render_template('files.html', files=files)
if __name__ == '__main__':
app.run(host='10.13.0.33', port=80)
вместе с соответствующим индексом. html:
<ul>
{% for file in files %}
<li><a href="{{ file }}">{{ file }}</a></li>
{% endfor %}
</ul>
Он работает, как и ожидалось, пока вы не попадете во SecondFolder!
рендеринг html выглядит нормально:
<ul>
<li><a href="FirstFolder/SecondFolder/file3.mp4">FirstFolder/SecondFolder/file3.mp4</a></li>
<li><a href="FirstFolder/SecondFolder/ThirdFolder">FirstFolder/SecondFolder/ThirdFolder</a></li>
</ul>
НО , когда я нахожу на ссылку, я получаю это (обратите внимание, что первая папка дублируется!): http://10.13.0.33/FirstFolder/FirstFolder/SecondFolder/ThirdFolder
Исходное сообщение: Я пытаюсь отобразить ссылки на видео во вложенных папках. В каждой папке много файлов (до 30), поэтому я не хочу загружать или воспроизводить их все сразу. Идея состоит в том, чтобы пользователь мог увидеть тот, который он хочет просмотреть, и нажать кнопку воспроизведения.
В настоящее время он разрабатывается / тестируется на Windows 10 в PyCharm.
Уровень (домашняя) страница и следующая папка ведут себя должным образом. Когда я выбираю следующую папку глубины, видео помечается как «Неверный источник»
Есть ли ограничение на глубину?
Вот мой код:
from flask import Flask
from os import listdir
import os.path
import pathlib
import ntpath
def remove_top_folder(path):
path_to_file = pathlib.Path(path)
path_to_file = path_to_file.relative_to(*path_to_file.parts[:1])
return str(path_to_file).replace('\\', '/')
def get_folders(folder):
if folder is not None and os.path.isdir(folder):
folders = []
for f in listdir(folder):
path_to_folder = os.path.join(folder, f).replace('\\', '/')
if os.path.isdir(path_to_folder) and not f.startswith('.'):
folders.append(remove_top_folder(path_to_folder))
return folders
return None
def get_videos(folder):
if folder is not None and os.path.isdir(folder):
videos = []
for f in listdir(folder):
path_to_video = os.path.join(folder, f).replace('\\', '/')
if os.path.isfile(os.path.join(folder, f)) and not f.startswith('.') and f.endswith('.mp4'):
videos.append(path_to_video)
return videos
return None
def get_stuff(folder):
folders = get_folders(folder)
videos = get_videos(folder)
if folder == 'static\\' or folder == 'static/':
rtn = ''
else:
rtn = '<H1>{}</H1>'.format(remove_top_folder(folder))
if videos is not None:
for file_name in videos:
file_name = file_name
rtn += '''
<div class="container">
<video width="320" controls preload="metadata">
<source src="{0}" type="video/mp4">
</video>
<div class="top">{1}</div>
</div>
'''.format(file_name, ntpath.basename(file_name))
for folder in folders:
rtn += '''
<div class="container">
<a href="{0}">{1}
</div>
'''.format(folder, ntpath.basename(folder))
return rtn
app = Flask(__name__)
@app.route('/', defaults={'u_path': ''})
@app.route('/<path:u_path>')
def catch_all(u_path):
if u_path is None:
folder = 'static//'
elif u_path.endswith('mp4'):
rtn = '''
<div class="container">
<video width="320" controls preload="metadata">
<source src="{0}" type="video/mp4">
</video>
<div class="top">{1}</div>
</div>
'''.format(u_path, remove_top_folder(u_path))
return rtn
else:
folder = os.path.join('static', u_path).replace('\\', '/')
stuff = get_stuff(folder)
html = '''
<!doctype html>
<html>
<body>
<h1>{0}</h1>
</body>
</html>
'''.format(stuff)
return html
if __name__ == '__main__':
app.run(host='10.13.0.33', port=80)
и мои папки выглядят примерно так:
static
file_1.mp4
First_Folder
file_2.mp4
Second_folder
file_3.mp4
Когда я захожу на веб-страницу, я получаю это:
Когда я нажимаю ссылку FirstFolder, я получаю это:
Когда я нажимаю ссылку SecondFolder, я получаю это: