OSError: [Errno 30] Heroku 上 Django 中的只读文件系统



我正在使用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'

我试图通过运行heroku shell来定位static_cdn,但什至无法在应用程序路径和根路径中找到static_cdn。但它似乎正在工作,因为其他通过表单上传的工作非常完美。

使用 Django 模型的upload_to正在工作,甚至在static_cdn中创建目录。

如何在 Heroku 上的static_cdn中创建目录,就像 Django 使用模型upload_to一样?

通过删除其他os.path.dirname()更改了MEDIA_ROOT路径,它现在可以工作了。

MEDIA_ROOT = os.path.join(BASE_DIR, 'static_cdn', 'media_root')

就我而言,发生此错误是因为我设置了STATIC_ROOT = '/static/'

这意味着它正在查看系统的根文件夹/然后static,这显然是只读的,

将其更改为STATIC_ROOT = 'static/'解决了我的问题。

我正在使用gTTS将文本转换为语音并将.mp3文件保存在媒体目录中

我不确定是什么导致了您的直接错误,但这在 Heroku 上效果不佳。它的文件系统是短暂的:你可以写入它,但是当你写的任何内容在测功机重新启动时都会丢失。这种情况经常发生(至少每天一次)。

Heroku 建议使用第三方文件或对象存储(如 Amazon S3)来存储生成的文件、上传的文件等。我建议锣沿着这条路走下去。有许多 Django 库用于使用 S3 和其他服务作为存储后端。

最新更新