I'm trying to this to work: users can download their files from their
account page from a url like this: 
http://example.com/account/download/a1234565789asedga-2/
for which django processes the authentication and then passes along
the info to nginx to serve the file.

However, I keep getting stuck. The view works in my local windows
machine (windows/apache), but not on my server (gentoo/nginx/fcgi).
*sigh* I'd really appreciate it if someone could take a look and help
me figure out what I'm doing wrong, please.

Here's the error message I'm getting from nginx:

2009/06/28 18:59:41 [error] 16316#0: *194 open() "/usr/
htmlBook.pdf.zip" failed (2: No such file or directory), client:
174.22.130.187, server: example.com, request: "GET /account/download/
a1234565789asedga-2/ HTTP/1.1", upstream: "fastcgi://127.0.0.1:1024",
host: "example.com", referrer: "http://example.com/account/shelf/";

I know what's wrong in the error message ('/usr/htmlBook.pdf.zip'),
but I can't tell *where* it's getting that incorrect location. As far
as I can tell, I'm sending it the actual location to grab the file and
file name ('/home/me/web/example.com/public/media/books/
Book.pdf.zip'), but apparently I'm not getting that from django to
nginx correctly.

Here are the relevant bits of code:

# part of the views.py

def download_file(request, dlkey=None, ftype=None):
    if request.user.is_authenticated():
        try:
            k = Ebook.objects.select_related().filter
(ftype__exact=ftype).filter
(book__orderdetail__dlkey__exact=dlkey).filter
(book__orderdetail__medium__exact='E')[:1]
            for e in k:
                ebook = e.ebook
                filename = os.path.join(PROTECTED_DIR, os.path.basename
(ebook))
                response = HttpResponse()
                response['X-Accel-Redirect'] = ebook
                response['Content-Disposition'] =
"attachment;filename=" + ebook
                return response
        except Exception:
            raise Http404


# part of the nginx configuration for the domain:

                location ^~ /account/download/ {
                        include         /etc/nginx/
fastcgi_params_django;
                        fastcgi_pass    127.0.0.1:1024;
                        alias           /home/me/web/example.com/
public/media/books/;
                }

                location ^~ /media/books/ {
                        root            /home/me/web/example.com/
public;
                        internal;
                }

# in settings.py
PROTECTED_DIR = '/home/me/web/example.com/public/media/books/'

If I do this in the view:

response['X-Accel-Redirect'] = ebook

I get the error message from above with nginx trying to grab the file
from the wrong location, but the browser presents me with a correctly
named (broken) zip file for download. (WinRAR says "The archive is
either in unknown format or damaged.")

If I do what I actually think I should be doing in the view:

response['X-Accel-Redirect'] = filename

I get a django 404 page with this as the request URL after clicking on
the download link: 
http://example.com/home/me/web/example.com/public/media/books/Book.pdf.zip/

The frustrating thing is this works (I can save the requested zip file
and open it just fine) on my windows setup with this part changed in
the views.py:

            for e in k:
                ebook = e.ebook
                filename = os.path.join(PROTECTED_DIR, os.path.basename
(ebook))
                handle = open(filename, 'rb')
                book = handle.read()
                handle.close()
                response = HttpResponse(book)
                response['Content-Type'] = 'application/x-zip-
compressed'
                response['Content-Disposition'] =
"attachment;filename=" + ebook
                return response

When I add the open() bit in the live version and change to:

response['X-Accel-Redirect'] = book

it gives me a big old mess. (Presumably because I'm trying to give it
the file itself, rather than the URI that X-Accel-Redirect requires
[1].)

So, the conclusion I've come to after many hours of reading docs,
trial and error, googling, and researching errors is that I haven't a
clue where it is that I'm telling django to send the wrong URL to
nginx. Help!

Thanks -

Annie


[1] http://wiki.nginx.org/NginxXSendfile
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to