Version 2.7.4-stable+timestamp.2013.10.14.15.16.29 recent enough? It's after your original post.
On Tuesday, January 28, 2014 2:49:52 AM UTC+13, Niphlod wrote: > > probably you're not running a recent web2py release. > > On Saturday, January 25, 2014 9:37:12 PM UTC+1, James Burke wrote: >> >> def fast_download(): >> import time, os >> import contenttype as c >> >> cache.client(time_expire=604800, quick='SVL')(lambda: 0)() >> >> file_id = request.args(-1) >> myfile = db.file(db.file.file==file_id) >> >> >> filename, file = db.file.file.retrieve(myfile.file) >> response.headers["Content-Type"] = c.contenttype(file_id) >> response.headers["Content-Disposition"] = "attachment; filename=%s" >> %filename >> >> >> stream = response.stream(file, chunk_size=64*1024, request=request) >> raise HTTP(200, stream, **response.headers) >> >> >> I tried using the above code, but results in the follow error message: >> >> cache.client(time_expire=604800, quick='SVL')(lambda: 0)() >> >> AttributeError: 'Cache' object has no attribute 'client' >> >> >> Am I missing something? >> >> Cheers >> >> -James >> >> On Monday, April 15, 2013 1:21:18 AM UTC+12, Niphlod wrote: >>> >>> ok. So, basically the problem is that response.stream is a "special" >>> kind of function. >>> It raises HTTP(200, content_of_the_file) instead of returning it, and >>> raising an HTTP(200) is a smart way to do it. >>> Unfortunately, this means that >>> def download(): >>> return response.stream(....) >>> >>> basically doesn't return from download, it raises an exception inside >>> response.stream and the execution is cutted of right in the response.stream >>> function. >>> >>> A decorator "outside" download() doesn't work, because it doesn't have >>> the chance to execute that function completely. >>> Now, on the bright side, the download() function should be the only one >>> behaving in this way, so the cache.client implementation shouldn't change. >>> >>> I'll see if we can use a "public" function just to adjust headers >>> beforehand without requiring for the actual function. >>> For the time being, this works ok. >>> >>> def download(): >>> cache.client(time_expire=604800, quick='SVL')(lambda: 0)() >>> """ >>> allows downloading of uploaded files >>> http://..../[app]/default/download/[filename] >>> """ >>> return response.download(request, db) >>> >>> basically because cache.client is coded to be a decorator, you have to >>> pass it a function. >>> In this case, a dummy "lambda:0" is passed. To fire the actual >>> "calculations" of the cache decorator, you have to call it (and that's why >>> there's an empty () at the end). The headers are then manipulated in the >>> current response, so response.download pick it up where headers are already >>> set, and when it returns the image, the headers are shipped with the >>> response. >>> >>> If you have any doubts, please ask. >>> >>> -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.