Actually you dont need even an ajax callback. Take this example:
## models/script.py ## db.define_table("mytable", Field("picture", "upload")) print "models executed!" ## controllers/default.py ## def index(): pictures = db(db.mytable).select() return dict(pictures=pictures) def download(): return response.download(request, db) ## views/default/index.html ## {{for picture in pictures:}} <img src="{{=URL('default', 'download', args=picture.picture)}}"> {{pass}} Let's say the table has 200 records and I want to show 200 thumbnails in the page. Q: How many times you will see "models executed!" in terminal? and how many times the table will be defined? the Auth, Crud, Service etc will be instantiated? A: 201 times. 1 for the first request and 200 for each image which calls the 'download' function. Now imagine a system which huge model files, too many tables and calling long running funtions. my tips: 1. Avoid models, use modules and import what you need in controller. 2. Avoid the download function, put uploadfolder='static' and build URL('static') when need an image. Or put your download function in a separate application which have access to the file system and database. -- Bruno Rocha [http://rochacbruno.com.br]