OSError: [Errno 30] Файловая система только для чтения в Django на Heroku - PullRequest
0 голосов
/ 25 апреля 2018

Я использую Django 2.0 и Heroku для размещения приложения.

Мои настройки каталога мультимедиа похожи на

App/settings/production.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'static_cdn', 'media_root')

Я использую gTTS для преобразования текста в речь и сохраняю файл .mp3 в каталоге мультимедиа:

tts_file_name = str(int(time.time())) + '.mp3'
joined_path = os.path.join(settings.MEDIA_ROOT, 'tts')
joined_path_with_file = os.path.join(joined_path, tts_file_name)

# create directory if does not exists
if not os.path.exists(joined_path):
    os.makedirs(joined_path)

tts = gTTS(text='Good morning', lang='en')
tts.save(joined_path_with_file)

# tts path to send to template
tts_media_url = os.path.join(settings.MEDIA_URL, 'tts', tts_file_name)

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

Но он не работает на Heroku и выдает ошибку:

OSError: [Errno 30] Read-only file system: '/static_cdn'

Я попытался найти static_cdn, запустив heroku shell, но не смог даже найти static_cdn в пути приложения и корневом пути. Но, похоже, это работает, так как другая загрузка через форму работает отлично.

с использованием модели Django upload_to работает, и даже каталог создается в static_cdn.

Как я могу создать каталог в static_cdn на Heroku так же, как Django использует модель upload_to?

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Изменен MEDIA_ROOT путь путем удаления дополнительного os.path.dirname(), и теперь он работает.

MEDIA_ROOT = os.path.join(BASE_DIR, 'static_cdn', 'media_root')
0 голосов
/ 25 апреля 2018

Я использую gTTS для преобразования текста в речь и сохранения файла .mp3 в каталоге мультимедиа

Я не уверен, что вызвало вашу непосредственную ошибку, но этоне будет работать очень хорошо на Heroku. Его файловая система эфемерна : вы можете писать в нее, но все, что вы пишете, будет потеряно при перезапуске динамометра.Это происходит часто (не реже одного раза в день).

Heroku рекомендует использовать стороннее хранилище файлов или объектов, например Amazon S3 , для хранения сгенерированных файлов, загруженных файлов.и т.д. Я рекомендую гонг по этому пути.Существует множество библиотек Django для использования S3 и других сервисов в качестве бэкэндов хранилища .

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