LINUX.ORG.RU

flask, download files

 ,


0

1

Ребята, застрял.

Итак, записываю файлы на сервер, в базу путь и так далее. При генерации страницы всё хорошо, путь картинок берётся из базы, но! Когда я пытаюсь скачать медиа файл (проиграть), то получаю сообщение: файл не найден. Хотя код такой же, как и у картинок.

Делал тестовую страницу, путь ставил без БД. Результат: файл не найден.

На что думаю, так это на то, что картинки лежать в static/images. Значит, flask знает корень (ну или у него по умолчанию). Медиа файлы записываются в другую директорию рядом. Надо что-то в конфиг писать?

Как flask отдаёт данные? Что почитать?



Последнее исправление: masterdilly (всего исправлений: 1)
Ответ на: комментарий от pawnhearts

Блиин, его поднимать на домашнем ноуте? Я так мимоходом читал, что nginx скармливают пути, да думал, что кроме него есть методы...

masterdilly
() автор топика
Ответ на: комментарий от pawnhearts

Я не туда смотрю. Утро. Вот код, ссылающийся на картинку:

 <img src="{{ album.logo_path }}">

вот код на файл:

<a href="{{ song.song_path }}">
  <button type="button" class="btn btn-success btn-xs">
  <span class="glyphicon glyphicon-play">
</span></button></a>

В браузере светит правильный путь:

http://127.0.0.1:5000/media/df/dffdb364dac557fbfb15ab850bf56146.mp3

И пишет - 404 Not found.

Я хз, но для разработки, думаю, что не нужно nginx. Возможно надо использовать send_from_directory(). Бог его знает. Поспать надо... И спасибо.

masterdilly
() автор топика
Ответ на: комментарий от masterdilly

Создай репу на гитхабе со всем кодом, и кинь сюда - люди помогут. А лучше найди на гитхабе уже готовый проект с uplod file flask в поиске гитхаба, короче, расширяй границы сознания)

menangen ★★★★★
()

Ч, конечно, слегка в шоке. Чего так сложно? Перечитав документацию нашел ссылку на send_from_directory(). Это ужос.

masterdilly
() автор топика
Ответ на: комментарий от masterdilly

Это после ruby on rails? Да, Flask местами сложноват/запутан, тоже сталкивался с этим. Т.к. статику НЕ отдают flask'ом. Её отдают nginx/caddy/lighttpd, ещё... gunicorn можно настроить на это дело, и проксю подкрутить, короче, что угодно, но не питоном =)

menangen ★★★★★
()
Ответ на: комментарий от menangen

Ну так-то он прав, на dev сервере удобно, чтобы оно статику оттадавало само.

pawnhearts ★★★★★
()
Ответ на: комментарий от masterdilly

Да. У меня так (работает и в runserver и на проде с uwsgi/nginx):

# config.py
basedir = os.path.abspath(os.path.dirname(__file__))
UPLOAD_PATH = os.path.join(basedir, 'audio')
# views.py
from flask import current_app, send_from_directory
@main.route('/audio/<path:filename>')
def audio_dir(filename):
    return send_from_directory(current_app.config['UPLOAD_PATH'], filename)
# audio.html
<param name="FlashVars" value="mp3={{ url_for('main.audio_dir', filename=item.name) }}" />
ivn86
()
Ответ на: комментарий от ivn86

Спасибо. Похоже и у меня написано. Но есть детали ;( Может, поможешь:
Эта функция «send_from_directory()» не хочет обрабатывать моё имя файла. Я прочел, что в целях безопасности(".." и «/»), а в имени я хранил кусочек пути.
Как передаёшь путь?
Как хранишь файлы, чтобы не дублировались и т.д.? Если я храню файлы по их хешу, я могу конечно и построить url, но думал, что зачем вызывать функцию, когда при сохранении файла на сервер, я генерирую и создаю сразу путь по 2-3 символам имени хеша, записываю его в базу. Вот с таким именем эта функция и не дружит :(. В нете инфы практически нет...

masterdilly
() автор топика
Ответ на: комментарий от masterdilly

Как передаёшь путь?

Никак, все файлы лежат в одном каталоге (audio). У меня их немного.

Как хранишь файлы, чтобы не дублировались и т.д.?

Генерирую уникальное имя. В базе храню исходное имя и то, под каким файл лежит на диске:

filename = form.upload.data.filename
uniquename = uuid.uuid4()
af = AudioFile(
    name = uniquename.__str__(),
    filename = filename
)
try:
    form.upload.data.save(os.path.join(current_app.config['UPLOAD_PATH'], uniquename.__str__()))
    db.session.add(af)
ivn86
()
Ответ на: комментарий от ivn86

Спасибо. А вот эта строка обязательна? current_app.config['UPLOAD_PATH']? Я вот просто создал config.py. С него экспорт (настройки БД, пути, разрешения и т.д.). Я просто не знаю, может эта опция даёт гибкость?

За uuid отдельная благодарность, не знал. Я делал hash файла через md5 (тот еще геморрой, как показала практика, так как надо было читать блоками и заметно проседала производительность (ну и я криворукий)).

masterdilly
() автор топика
Ответ на: комментарий от masterdilly

По идее не обязательна. Но если ты хранишь пути в конфиге, то как считываешь их во views.py? ИМХО единственно правильный способ через current_app, т.е. прямое обращение к инстансу приложения.

ivn86
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.