Cómo devolver una imagen en una respuesta HTTP con CherryPy

Tengo un código que genera un CairoImageSurface, y lo expongo así:

def preview(...):
    surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
    ...
    cherrypy.response.headers['Content-Type'] = "image/png"
    return surface.get_data()
preview.exposed = True

Esto no funciona (los navegadores informan que la imagen tiene errores).

He probado esosurface.write_to_png('test.png') funciona, pero no estoy seguro de en qué volcar los datos para devolverlos. ¿Estoy adivinando algún objeto parecido a un archivo? De acuerdo ala documentación de pycairo, get_data() devuelve un búfer. También he intentado ahora:

tempf = os.tmpfile()
surface.write_to_png(tempf)
return tempf

Además, ¿es mejor crear y mantener esta imagen en la memoria (como estoy tratando de hacer) o escribirla en el disco como un archivo temporal y servirla desde allí? Solo necesito la imagen una vez, luego se puede descartar.

Respuestas a la pregunta(4)

Su respuesta a la pregunta