Загрузить файл из приложения Flask, запущенного в Docker-контейнере - PullRequest
0 голосов
/ 11 декабря 2018

Я делаю приложение Flask, которое запускается в контейнере Docker.Пока все работает нормально, но теперь я хочу создать метод GET, который должен возвращать файл для загрузки пользователем.Для этого я попробовал функции Flask send_file и send_from_directory.Они оба работают, когда я запускаю свое приложение как есть, но как только я помещаю его в контейнер Docker, все перестает работать.

Если я использую send_file, я получаю ошибку file not found, хотя яЯ могу вызвать print(os.path.isfile), используя тот же путь к файлу, и он появится.

Если я использовал send_from_directory, используя правильный путь и имя файла, я получаю вместо этого ошибку 404.

Опять же, это только при запуске из контейнера Docker.Может ли это быть проблема с разрешением?

Пример метода:

class DownloadLog(Resource):
    def get(self):
        print(os.path.isfile('logfile.log')  # Returns 'True'
        return send_from_directory('.', 'logfile.log')

1 Ответ

0 голосов
/ 28 июля 2019

Я столкнулся с той же проблемой и исправил ее, указав полный путь к файлу вместо относительного пути, когда приложение работает в контейнере.

Например, когда я запускаю только фляжку, Я могу использовать что-то вроде:

send_from_directory(
    current_app.config["DOWNLOAD_FOLDER"], filename.jpg, as_attachment=True
)

Однако, если приложение запускается в контейнере, мне нужно изменить его на:

send_from_directory(
    os.path.join(os.getcwd(), current_app.config["DOWNLOAD_FOLDER"]),
    filename.jpg,
    as_attachment=True,
)

В основном os.getcwd() является корнем приложенияпапка, определенная внутри файла Dockerfile или файла docker-compose.yml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...