2012-05-02 30 views
8

Qual è lo scenario tipico di archiviazione dei file di immagine in Django? Più specificamente, le immagini sono memorizzate direttamente in un blob del database (ad esempio MongoDB GridFS), su un file system locale o Amazon S3? Per tutti e tre i casi sono disponibili strumenti o pacchetti django per semplificare la vita con l'archiviazione delle immagini?Come archiviare i file immagine in Django?

Attualmente sto salvando immagini e servendo dalla cartella media nel progetto Django su un server di sviluppo locale. Qualcuno mi ha detto che è una cattiva pratica servire file statici sulla stessa macchina. Quindi, qual è il tipico scenario del mondo reale di archiviazione e pubblicazione di immagini statiche in Django?

risposta

8

Un tipico, ad esempio nel mondo reale potrebbe essere quella di memorizzare le immagini caricate in una sottodirectory della media/ directory del tuo sito :)

Questo può diventare un problema se avete bisogno di memorizzare più immagini di server app ha disco rigido spazio, o hai bisogno di più di un app server, o vuoi usare un CDN per diminuire la latenza, o ... una delle mille altre cose.

Ma, a meno che non si abbiano requisiti specifici specifici, l'unico modo per sapere quale (se esiste) di quelle migliaia di cose di cui preoccuparsi è far avviare il sito e il modo più veloce per per salvare le immagini in una sottodirectory di media/.

Se si esegue questa operazione utilizzando un FileField, e si sta attenti nel codice non assumere, per esempio, che l'immagine è un file sul disco locale (ad esempio, si fa utilizzare il metodo di .url()FileFile e tu non utilizza la proprietà .path), sarà semplice spostare quelle immagini su un backend più appropriato quando (e se) arriva il momento.

4

Per impostazione predefinita, Django saves all of your files (and images) in the MEDIA_ROOT. Puoi comunque scrivere un custom file storage, per salvarlo su altri posti.

Cosa scegliere? Dipende davvero.
Quanti file prevedi di memorizzare? Quanto spazio di archiviazione useranno? Quanta larghezza di banda? Pensi che ci saranno picchi di utilizzo molto elevato?

In genere, il file system locale è l'opzione più veloce; ma se vedi che quelle immagini useranno troppa larghezza di banda, allora potresti volerle scaricare, specialmente se il modello di utilizzo vede picchi elevati. Viceversa, se è necessario ridimensionare su diversi server, potrebbe essere utile spostarli in un database.

In ogni caso, è necessario decidere solo dopo aver ottenuto alcuni dati, se possibile dati reali. Passare a un altro sistema di archiviazione è abbastanza semplice, quindi vorrei iniziare con il file system locale e quindi passare a qualcosa di più bello solo dopo aver visto i problemi.

1

Dipende davvero dalla soluzione che stai cercando di risolvere. Esistono casi in cui s3 può essere una soluzione molto migliore rispetto all'archiviazione di file locale. s3 offre una maggiore flessibilità in termini di possibilità di accedere ai dati da diverse app Web e di essere disaccoppiati dal server che si sta utilizzando. Penso che s3 sia una strada da percorrere se pensi di usare molte immagini. Se pensi che ci sia una quantità limitata di immagini che stai per usare, allora l'archiviazione locale sul server sarebbe un'implementazione eccellente (credo).

In termini di strumenti che è possibile utilizzare, vorrei esaminare PIL.http://www.pythonware.com/products/pil/

3

Non è una cattiva pratica, di per sé. Penso che chiunque ti abbia detto che sia un po 'confuso. Django dice che non dovresti mai servire le risorse statiche con Django, cioè dovrebbero essere servite direttamente dal server web che stai usando come proxy inverso per Django (Apache, nginx, ecc.), Ma non contesta sul fatto che debba essere su un server diverso o sullo stesso server.

Se si dispone di un'app o di un sito Web semplici, l'utilizzo di un server completamente diverso per i file statici è probabilmente eccessivo. È importante solo nei casi di concorrenza elevata (si pensi a Twitter, Facebook, ecc.) In cui l'applicazione non può permettersi che il server web si preoccupi di nulla ma non di trasferire richieste all'app stessa. Ora, alcuni host web offrono storage "cloud" per andare insieme al tuo VPS (Rackspace, per esempio). Se stai usando un host di questo tipo, approfitta di quello che hai, ma non è necessario per la maggior parte.

Tuttavia, v'è vantaggio nel servire risorse statiche sotto un diverso sottodominio. È possibile utilizzare lo stesso server, ma l'utilizzo di un sottodominio (ad esempio static.mysite.com) consentirà ai browser di eseguire più download paralleli, in alcuni casi, e per lo meno, impedendo che i cookie del sito Web principale vengano collegati a ogni static richiesta.

Problemi correlati