python | March 20, 2020
# vibe/settings.py
MEDIA_URL = './stream/'
MEDIA_ROOT= os.path.join(os.path.dirname(BASE_DIR), "media_root")
open(file_path, mode, encoding)
: open할 파일경로, 파일 모드, 인코딩 방식 등을 지정할 수 있다.r
: 읽기 (default)
w
: 쓰기 (파일이 있으면 모든 내용 삭제)x
: 쓰기 (파일이 있으면 오류 발생)a
: 쓰기 (파일이 있으면 뒤에 내용을 추가)
+
: 읽기쓰기
t
: 텍스트 모드 (default)b
: 바이너리 모드HTTP Range Requests
: HTTP Response Headers에 Accept-Ranges
항목이 있으면 해당 서버가 range 요청을 지원하는 상태인 것이다.# music/views.py
from django.http import JsonResponse, StreamingHttpResponse
class MusicStreamView(View):
def get(self, request, music_id):
try:
music = Music.objects.get(id = music_id)
content = MEDIA_URL + f"{music_id}.mp3"
response = StreamingHttpResponse(self.iterator(content), status = 200)
response['Cache-Control'] = 'no-cache'
response['Content-Disposition'] = f'filename = {music_id}.mp3'
response['Content-Type'] = 'audio/mp3'
response['Content-Length'] = len(open(content,'rb').read())
response['Accept-Ranges'] = 'bytes'
return response
except Music.DoesNotExist:
return JsonResponse({"message": "MUSIC_DOES_NOT_EXIST"}, status = 400)
except FileNotFoundError:
return JsonResponse({"message": "FILE_DOES_NOT_EXIST"}, status = 400)
def iterator(self, content):
with open(content, 'rb') as music:
while True:
read_music = music.read()
if read_music:
yield read_music
else:
break
Reference:
[SoundHub] HTTP Range Requests
MDN: Range-Requests
MDN: Range