2010-06-09 14 views
32

Necesito mostrar imágenes de forma segura solo a usuarios validados (es decir, no se pueden servir como archivos estáticos). Actualmente tengo la siguiente vista de Python en mi proyecto Django, pero parece ineficiente. Alguna idea para una mejor manera?La mejor manera de escribir una imagen en Django HttpResponse()

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

(imagen ha sido importada desde PIL.)

+2

como se comentó Santia: "En caso de que usted intenta esto con una versión más reciente de Django (como yo ...) a partir de Django 1.7, el tipo MIME de palabras clave se renombró a cONTENT_TYPE para' HttpResponse () '" – kenorb

Respuesta

62

Bueno, re-codificación es a veces necesaria (es decir, la aplicación de una marca de agua sobre una imagen, manteniendo el original intacto), pero para el más simple de los casos, puede utilizar:

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 
+13

Dios mío, si pudiera, te compraría una cerveza. – Nielsvh

+2

Para determinar el tipo MIME del archivo, puede usar [python-magic] (https://github.com/ahupp/python-magic). – Arjan

+14

'mimetype' ha quedado obsoleto en Django 1.5, [esta opción ahora se llama' content_type'] (https://docs.djangoproject.com/en/1.5/ref/request-response/#django.http.HttpResponse.__init__) . – bjacobel

Cuestiones relacionadas