TL; DR: I used SpooledTemporaryFile with FileResponse to server generated QR images directly from memory, no disk IO involved.
Please see my code sample with notes:
# this is views.py in a typical Django project
# dependencies
from django.http import HttpResponse, FileResponse
import qrcode
from qrcode.image.pure import PyPNGImage
from tempfile import SpooledTemporaryFile
def qr(request, keyword):
domain_name = request.META['HTTP_HOST']
# to generate a QR code in PNG format
img = qrcode.make(f'https://{domain_name}/{keyword}', image_factory=PyPNGImage)
# a virtual file in memory
in_memory_file = SpooledTemporaryFile()
# save the image into the virtual file
img.save(in_memory_file)
# this step is important
# seek(0) rewinds the pointer of this IO stream to its beginning which was set to its end from previous step
in_memory_file.seek(0)
# return the image as qr.png in an HTTP response
return FileResponse(in_memory_file, filename='qr.png')🙂
