джанго прочитал mp3-файл и отправил его в качестве ответа

#python #django #django-rest-framework

Вопрос:

views.py

 from . import models, serializers
from rest_framework import viewsets, status
from rest_framework.response import Response
from rest_framework.views import APIView

class getSongData(APIView):
    serializer_class=serializers.SongSerializer

    def get(self, request, id, format=None):
        serializer = serializers.SongSerializer(models.Song.objects.get(id=id))
        file_loc = serializer.data['audio_file'] # go below to see the data

        # read the mp3 file

        return Response(file_data)
 

urls.py

 from django.urls import path
from . import views

urlpatterns = [
    path('songs/audio/<int:id>', views.getSongData.as_view(), name='audio')
]
 

serializers.py

 from rest_framework import serializers
from . import models

class SongSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Song
        fields = '__all__'
 

models.py

 from django.db import models
from datetime import datetime

class Song(models.Model):
    title = models.CharField(max_length=64)
    audio_file = models.FileField()
    genre = models.CharField(max_length=64)
    created_at = models.DateTimeField(default=datetime.utcnow)
 

Данные

 [
    {
        "id": 1,
        "title": "Kubbi | Cascade",
        "audio_file": "/media/Kubbi__Cascade.mp3",
        "genre": "Instrumental",
        "created_at": "2021-07-24T10:21:48Z"
    }
]
 

Когда пользователь нажимает на песню (допустим, идентификатор песни=1), запрос отправляется на ‘http://localhost:8000/api/songs/audio/1″ затем в views.py Я извлекаю местоположение песни с помощью serializer.data[‘audio_file’], который = «/media/Kubbi__Cascade.mp3», все, что я хочу, это прочитать этот аудиофайл и отправить данные в качестве ответа обратно на веб-интерфейс, я пробовал много решений, но они выдавали ошибки…

Комментарии:

1. вы хотите вернуть воспроизводимое аудио в виде файла?

2. да, чтобы пользователь мог воспроизвести/загрузить его

Ответ №1:

если вы хотите сделать это с помощью чистого django, это сработает

 from django.http import FileResponse


class getSongData(APIView):
    serializer_class=serializers.SongSerializer

    def get(self, request, id, *args, **kwargs):
        song = models.Song.objects.get(id=id)        
        return FileResponse(song.audio_file.open())
 

но предпочтительно, чтобы вы обслуживали файлы через обратный прокси-сервер для повышения производительности.