Как сохранить медиафайлы в локальном хранилище 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 использует свою собственную файловую систему, поэтому вы не можете сохранять файлы на одном дино и открывать их на другом.

Вернуться на верх