2012-05-02 24 views
8

¿Cuál es el escenario típico de almacenamiento de archivos de imagen en Django? Más específicamente, ¿las imágenes se almacenan directamente en un blob de base de datos (por ejemplo, MongoDB GridFS), en un sistema de archivos local o Amazon S3? Para los tres casos, ¿hay herramientas o paquetes django disponibles para simplificar su vida con el almacenamiento de imágenes?¿Cómo almacenar archivos de imagen en Django?

Actualmente estoy guardando imágenes ay sirviendo desde la carpeta media en el proyecto Django en un servidor de desarrollo local. Alguien me dijo que es una mala práctica servir archivos estáticos en la misma máquina. Entonces, ¿cuál es un escenario típico del mundo real de almacenamiento y servicio de imágenes estáticas en Django?

Respuesta

8

A, típico ejemplo del mundo real sería la de almacenar las imágenes cargadas en un subdirectorio de media/ directorio de su sitio :)

Esto puede convertirse en un problema si necesita almacenar más imágenes que el servidor de aplicación tiene disco duro espacio, o necesita más de un servidor de aplicaciones, o desea usar un CDN para disminuir su latencia, o ... una de mil cosas más.

Pero, a menos que tenga requisitos iniciales específicos, la única forma de saber cuál (si la hay) de esas mil cosas de las que deberá preocuparse es que su sitio se lance y la forma más rápida de hacerlo. hacer eso es almacenar imágenes en un subdirectorio de media/.

Si hace esto usando un FileField, y se tiene cuidado en su código no asumir, por ejemplo, que la imagen es un archivo en el disco local (por ejemplo, se hace utiliza el método de .url()FileFile y usted no use use la propiedad .path), será sencillo mover esas imágenes a un servidor más apropiado cuando (y si) llegue el momento.

4

De forma predeterminada, Django saves all of your files (and images) in the MEDIA_ROOT. Sin embargo, puede escribir un custom file storage para guardarlo en otros lugares.

¿Qué elegir? Realmente depende.
¿Cuántos archivos planea almacenar? ¿Cuánto almacenamiento usarán? Cuanto ancho de banda? ¿Crees que habrá picos de muy alto uso?

Por lo general, el sistema de archivos local es la opción más rápida; pero si ve que esas imágenes usarán demasiado de su ancho de banda, entonces puede desear descargarlas, especialmente si el patrón de uso observa picos altos. Por el contrario, si necesita escalar a varios servidores, entonces puede ser beneficioso moverlos a una base de datos.

De todos modos, debe decidir solo después de obtener algunos datos, si es posible, datos reales. Cambiar a un sistema de almacenamiento diferente es bastante fácil, así que comenzaría con el sistema de archivos local y luego cambiaría a algo más exclusivo solo después de ver problemas.

1

Realmente depende de la solución que está tratando de resolver. Hay casos en que s3 puede ser una solución mucho mejor que el almacenamiento de archivos local. s3 ofrece más flexibilidad en términos de poder acceder a los datos de diferentes aplicaciones web y estar desacoplado del servidor que está utilizando. Creo que s3 es una ruta a seguir si planeas usar muchas imágenes. Si cree que hay una cantidad limitada de imágenes que va a utilizar, entonces el almacenamiento local en el servidor sería una buena implementación (creo).

En términos de herramientas que puede usar, examinaría PIL.http://www.pythonware.com/products/pil/

3

No es una mala práctica, per se. Creo que quien te dijo eso está un poco confundido. Django dice que nunca debe servir recursos estáticos con Django, es decir, que deben ser servidos directamente por el servidor web que está utilizando como un proxy inverso para Django (Apache, nginx, etc.), pero no contiene dudas sobre si debe estar en un servidor diferente o en el mismo servidor.

Si tiene una aplicación o sitio web simple, usar un servidor completamente diferente para archivos estáticos probablemente sea exagerado. Solo importa en casos de concurrencia alta (piense en Twitter, Facebook, etc.) donde la aplicación no puede permitirse que el servidor web se preocupe por nada más que por el envío de solicitudes a la aplicación en sí. Ahora, algunos servidores web ofrecen almacenamiento en "nube" para que coincida con su VPS (Rackspace, por ejemplo). Si está utilizando un host de este tipo, aproveche lo que tiene, pero no es necesario en su mayor parte.

Sin embargo, no es beneficio en el servicio a los recursos estáticos bajo un subdominio diferente . Puede usar el mismo servidor, pero usar un subdominio (por ejemplo, static.mysite.com) permitirá que los navegadores hagan más descargas paralelas, en algunos casos, y al menos, evita que las cookies del sitio web principal se adjunten a cada estática. solicitud.

Cuestiones relacionadas