#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())
но предпочтительно, чтобы вы обслуживали файлы через обратный прокси-сервер для повышения производительности.