Matt Barnicle
mattb at wageslavery.org
Fri Sep 26 01:42:40 EDT 2008
> 2008/9/25 Matt Barnicle <mattb at wageslavery.org>: >>> 2008/9/24 Matt Barnicle <mattb at wageslavery.org>: >>>>> Are you setting a content length on the response before calling >>>>> req.sendfile()? >>>>> >>>>> How many concurrent requests for these files are you receiving and >>>>> how long does it take to download a file? >>>>> >>>>> Graham >>>> >>>> yes, i believe so.. now that you mention it, i haven't verified >>>> the file size from the code below, i will do that to be sure. here >>>> is the code: >>>> >>>> file_path = self.conf.run.app_folder + 'public' + download.path >>>> file_stat = os.stat(file_path) >>>> file_size = str(file_stat.st_size) >>>> >>>> self.req.headers_out['Content-Length'] = file_size >>>> self.req.headers_out['Content-Disposition'] = 'attachment; >>>> filename=%s' % os.path.basename(file_path) >>>> >>>> bytes_sent = self.req.sendfile(file_path) >>> >>> BTW, now that you are using mod_python 3.3.1, instead of using >>> req.sendfile(), you could possibly delegate serving of the static file >>> back to Apache. From memory this can be done using: >>> >>> req.filename = self.conf.run.app_folder + 'public' + >>> download.path >>> req.finfo = apache.stat(req.filename, apache.APR_FINFO_MIN) >>> return apache.DECLINED >>> >>> By returning apache.DECLINED you say mod_python handler will not >>> actually handle it, and by having updated req.filename and >>> req.fileinfo updated to new file, when it falls through to >>> default-handler it should serve it as static file. >>> >>> Doing it this way should bypass prior Apache access control checks. >>> Thus file doesn't need to be in Apache document tree or anywhere else >>> that is accessible. >>> >>> I believe doing it this way also has benefit that Apache will >>> automatically set various headers that you probably wouldn't be. >>> >>> Please let us know if this alternate method works. >>> >>> Graham >> i tried the following but it doesn't seem to do what i want: >> >> DocumentRoot /var/www/my/application/public >> <Directory /var/www/my/application/public> >> AddHandler python-program .py >> PythonHandler myhandler >> </Directory> > > Use SetHandler instead of AddHandler. > > DocumentRoot /var/www/my/application/public > <Directory /var/www/my/application/public> > SetHandler python-program > PythonHandler myhandler > </Directory> > > Graham ok, getting closer.. now i get a 404 error in the browser saying 'The requested URL /download/file/3 was not found on this server.' and in the apache logs: File does not exist: /var/www/application/public/downloads/music/music.zip/file/3 so it looks like it's taking the last part of the URI and appending it to the physical filename and looking for that... the request URI is 'http://example.com/download/file/3'. the 'download' controller is what manages the music downloads. - m@
|