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.
--
---
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 [email protected].
For more options, visit https://groups.google.com/groups/opt_out.