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

时间:2018-04-25 05:27:54

标签: python django heroku

我正在使用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中创建了目录。

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

2 个答案:

答案 0 :(得分:1)

  

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

我不确定是什么原因造成你的即时错误,但这在Heroku上不会很好用。 Its filesystem is ephemeral:你可以写信给它,但是当你的dyno重新启动时,你写的任何东西都会丢失。这happens frequently(每天至少一次)。

Heroku recommends using a third-party file or object store like Amazon S3用于存储生成的文件,上传的文件等。我建议使用此路径。有many Django libraries for using S3, and other services, as storage backends

答案 1 :(得分:0)

通过删除其他MEDIA_ROOT来更改os.path.dirname()路径,现在它正在运行。

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