将图像写入Django HttpResponse()的最佳方法

k-g*_*g-f 43 image django-views

我需要安全地向经过验证的用户提供图像(即它们不能作为静态文件提供).我目前在我的Django项目中有以下Python视图,但它似乎效率低下.有什么想法更好的方法吗?

def secureImage(request,imagePath):
    response = HttpResponse(mimetype="image/png")
    img = Image.open(imagePath)
    img.save(response,'png')
    return response
Run Code Online (Sandbox Code Playgroud)

(图像从PIL导入.)

Ste*_*Nch 76

好吧,有时需要重新编码(即在保持原始状态不变的情况下在图像上应用水印),但对于最简单的情况,您可以使用:

try:
    with open(valid_image, "rb") as f:
        return HttpResponse(f.read(), content_type="image/jpeg")
except IOError:
    red = Image.new('RGBA', (1, 1), (255,0,0,0))
    response = HttpResponse(content_type="image/jpeg")
    red.save(response, "JPEG")
    return response
Run Code Online (Sandbox Code Playgroud)

  • `mimetype`在Django 1.5被弃用,[此选项是现在所谓`content_type`](https://docs.djangoproject.com/en/1.5/ref/request-response/#django.http.HttpResponse.__init__). (14认同)
  • 要确定文件的MIME类型,可以使用[python-magic](https://github.com/ahupp/python-magic). (2认同)

Sum*_*ran 10

利用FileResponse
更干净的方式,这里我们不必担心Content-LengthContent-Type标头,它们是通过猜测 的内容自动添加的open()

from django.http import FileResponse

def send_file(response):

    img = open('media/hello.jpg', 'rb')

    response = FileResponse(img)

    return response
Run Code Online (Sandbox Code Playgroud)

  • 哦,文档说“文件将自动关闭......”。(https://docs.djangoproject.com/en/3.2/ref/request-response/#fileresponse-objects) (2认同)