How do you Require Login for Media Files in Django How do you Require Login for Media Files in Django apache apache

How do you Require Login for Media Files in Django


It seems to me that the method you outlined in your code should work. It's really no different than any other protected resource: your views can serve files from disks, records from databases, rendered templates or anything. Just as the login_required decorator prevents unauthorized access to other views, it will prevent such access to your view serving protected media.

Am I missing something from your question here? Please clarify if that's the case.

EDIT: With regard to the django doc link in your comment: that's the method for simply serving any request file from a particular directory. So, in that example URLS like /site_media/foo.jpg, /site_media/somefolder/bar.jpg will automatically look for files foo.jpg and somefolder/bar.jpg under document_root. Basically, every thing under document_root will be publicly available. That's obviously insecure. So you avoid that with your method.

It's also considered inefficient because django is just adding a lot of unnecessary overhead when all you need is something like Apache to take a URL request and map it to a file on the hard drive. (You don't need django sessions, request processing, etc.)

In your case, this may not be such a big concern. First, you've secured the view. Second, it depends on your usage patterns. How many requests do you anticipate for these files? You're only using django for authentication -- does that justify other overhead? If not, you can look into serving those files with Apache and using an authentication provider. For more on this, see the mod_wsgi documentation:

There are similar mechanisms available under mod_python I believe. (Update: just noticed the other answer. Please see Andre's answer for the mod_python method.)

EDIT 2: With regard to the code for serving a file, please see this snippet:

The send_file method uses a FileWrapper which is good for sending large static files back (it doesn't read the entire file into memory). You would need to change the content_type depending on the type of file you're sending (pdf, jpg, etc).


Read this Django ticket for more info. Start at the bottom to save yourself some time. Looks like it just missed getting into Django 1.2, and I assume also isn't in 1.3.

For Nginx, I found this Django snippet that takes advantage of the X-Accel-Redirect header, but haven't tried it yet.


If I understand your question correctly you want to restrict access to files that are not being served by Django, for example, with an Apache server?

What you would then require is some way for this Apache server to use Django as an authentication source.

This django snippet describes such a method. It creates an access handler in Django which is used by Apache when a request for a static file comes in that needs to be protected:

<Location "/protected/location">            PythonPath "['/path/to/proj/'] + sys.path"              PythonOption DJANGO_SETTINGS_MODULE myproj.settings        PythonOption DjangoPermissionName '<permission.codename>'        PythonAccessHandler my_proj.modpython #this should point to accesshandler            SetHandler None</Location>

Hope this helps, the snippet was posted a while ago, so things might have changed between Django versions :)