Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django: Serving a Download in a Generic View

So I want to serve a couple of mp3s from a folder in /home/username/music. I didn't think this would be such a big deal but I am a bit confused on how to do it using generic views and my own url.

urls.py

url(r'^song/(?P<song_id>\d+)/download/$', song_download, name='song_download'),

The example I am following is found in the generic view section of the Django documentations: http://docs.djangoproject.com/en/dev/topics/generic-views/ (It's all the way at the bottom)

I am not 100% sure on how to tailor this to my needs. Here is my views.py

def song_download(request, song_id):
    song = Song.objects.get(id=song_id)

    response = object_detail(
        request,
        object_id = song_id,
        mimetype = "audio/mpeg",
    )
    response['Content-Disposition'= "attachment; filename=%s - %s.mp3" % (song.artist, song.title)

    return response

I am actually at a loss of how to convey that I want it to spit out my mp3 instead of what it does now which is to output a .mp3 with all of the current pages html contained. Should my template be my mp3? Do I need to setup apache to serve the files or is Django able to retrieve the mp3 from the filesystem(proper permissions of course) and serve that? If it do need to configure Apache how do I tell Django that?

Thanks in advance. These files are all on the HD so I don't need to "generate" anything on the spot and I'd like to prevent revealing the location of these files if at all possible. A simple /song/1234/download would be fantastic.

like image 788
TheLizardKing Avatar asked Apr 21 '10 08:04

TheLizardKing


People also ask

How do I make my Django file downloadable?

In order to create a download link, we need to create a Django view that would serve the files: # views.py import mimetypes ... def download_file(request): # fill these variables with real values fl_path = '/file/path' filename = 'downloaded_file_name. extension' fl = open(fl_path, 'r') mime_type, _ = mimetypes.

What is redirect view in Django?

In Django, you redirect the user to another URL by returning an instance of HttpResponseRedirect or HttpResponsePermanentRedirect from your view. The simplest way to do this is to use the function redirect() from the module django.shortcuts .

What is As_view in Django?

as_view is the function(class method) which will connect my MyView class with its url. From django docs: classmethod as_view(**initkwargs) Returns a callable view that takes a request and returns a response: You just can't use class-based views like you could in normal function-based views.


1 Answers

Why do you want to do this with a generic view? It's very easy to do this without generic views:

from django.http import HttpResponse


def song_download(request, song_id):
    song = Song.objects.get(id=song_id)
    fsock = open('/path/to/file.mp3', 'rb')
    response = HttpResponse(fsock, content_type='audio/mpeg')
    response['Content-Disposition'] = "attachment; filename=%s - %s.mp3" % \
                                     (song.artist, song.title)
    return response

I'm not sure if it's possible to make this work somehow with a generic view. But either way, using one is redundant here. With no template to render, the context that is automatically provided by the generic view is useless.

like image 153
Ben James Avatar answered Oct 21 '22 05:10

Ben James