Как сохранить медиафайлы в локальном хранилище Heroku с помощью Django?
У меня есть приложение Django REST с React для клиента. Я записываю файл с помощью React и отправляю его в Django. Когда я сохраняю его, я изменяю его с помощью ffmpeg и сохраняю снова в той же папке с новым именем, команда ffmpeg выглядит так:
os.system(f"ffmpeg -i {audio_path} -ac 1 -ar 16000 {target_path}")
Поскольку мне нужен путь к аудио как для открытия, так и для сохранения, я не могу использовать облачные хранилища типа "Bucket S3, Cloudinary и т.д.". А тот факт, что я использую его всего несколько секунд, а затем удаляю, делает Heroku (приложение развернуто там) идеальным местом для непостоянного сохранения. Проблема в том, что файл не сохраняется в моей библиотеке с медиафайлами. Он сохраняется в базе данных postgre, но не сохраняется в моей файловой системе, и когда я пытаюсь получить к нему доступ, моя программа возвращает, что файла с таким именем не существует. Мой вопрос Как я могу сохранить медиа файлы в файловой системе Heroku и как получить к ним доступ?
settings.py
MEDIA_ROOT = os.path.join(BASE_DIR,'EmotionTalk/AI_emotion_recognizer/recordings')
MEDIA_URL = '/'
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('EmotionTalk.emotion_talk_app.urls')),
path('auth/', include('EmotionTalk.auth_app.urls')),
path('api-token-auth/', views.obtain_auth_token),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) \
+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
views.py
def post(self, request):
file_serializer = RecordingSerializer(data=request.data)
if file_serializer.is_valid():
file_serializer.save()
file_name = file_serializer.data.get('recording')
owner_id = file_serializer.data.get('owner_id')
current_emotions_count = len(Profile.objects.get(user_id=owner_id).last_emotions)
print(file_name)
recognize_emotion.delay(file_name, owner_id)
return Response({
'data': file_serializer.data,
'current_emotions_count': current_emotions_count
}, status=status.HTTP_201_CREATED)
return Response(file_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
tasks.py
def parse_arguments(filename):
import argparse
parser = argparse.ArgumentParser()
new_filename = filename.lstrip('v')
parser.add_argument("audio_path")
parser.add_argument("target_path")
args = parser.parse_args([f'EmotionTalk/AI_emotion_recognizer/recordings/{filename}',
f'EmotionTalk/AI_emotion_recognizer/recordings/{new_filename}'])
audio_path = args.audio_path
target_path = args.target_path
if os.path.isfile(audio_path) and audio_path.endswith(".wav"):
if not target_path.endswith(".wav"):
target_path += ".wav"
convert_audio(audio_path, target_path)
return target_path
else:
raise TypeError("The audio_path file you specified isn't appropriate for this operation")
parse_arguments вызывается из recognize_emotion
Я использовал два дино, один guinicorn и второй celery. Похоже, что каждый дино в heroku использует свою собственную файловую систему, поэтому вы не можете сохранять файлы на одном дино и открывать их на другом.