Question

Je voudrais créer dynamiquement des vignettes en fonction des paramètres dans l'URL. Par exemple, http://mysite.com/images/1234/120x45.jpg créerait une vignette de 120x45 pour id d'image 1234.

La solution évidente à cela est d'avoir une vue django qui effectue les opérations suivantes:

  1. Recherchez une version précédente de l'image mis en cache à cette taille.
  2. Créer une miniature si elle est mise en mémoire cache pas (une logique de verrouillage de sorte que seul 1 processus crée la vignette et d'autres processus attendre).
  3. Tuyauterie les résultats par django.

Cela devrait « travailler », mais je suis préoccupé par la performance. Je n'aime pas l'idée d'utiliser django pour servir du contenu statique. Quels sont les autres façons d'accomplir ce problème?

Était-ce utile?

La solution

Vous ne devez pas utiliser Django pour servir le contenu statique directement. Il suffit que votre route du serveur 404 demandes de dossier vos images à une vue Django, où il se démonte le nom du fichier et génère la vignette appropriée, avant de rediriger vers l'URL originale (qui ne sera, espérons plus de 404).

En ce qui concerne l'autre suggestion django-de imagekit de réponse, je ne suis pas sûr qu'il ne fait rien pour vous permettre de dynamiquement générer pouces d'image basé sur l'URL, mais je ne recommanderais certainement l'utiliser pour toutes les fonctionnalités il ne.

Modifier

En ce qui concerne la structure de l'URL réelle, je me sens un /images/filename-120x45.jpg plus typique vous permettra de filtrer plus facilement les 404 demandes qui ont rien à voir avec la génération de vignettes dynamiques. Disons, par exemple, qu'il ya des tonnes de 404 erreurs pour /images/original_size_image.jpg. Vous ne voudriez pas que ceux qui sont mis en déroute à Django, et vous ne pouvez correspondre les noms de fichiers de ce format avec regex. [modifier final]

Vous devez être prudent si de laisser tout le monde au courant de ce spam fonction de votre application Django. Ils pourraient le tuer avec un nombre infini de combinaisons de taille d'image et le nom à portée de main. Vous auriez besoin de comprendre comment mettre des limites supérieures à ces demandes, comme la redirection vers un 404 si l'une dimension est plus grande que l'original, ou même trouver comment plafonner les demandes de dimensions multiples de la même image. Peut-être cela est ce que vous vous en venir en mentionnant « verrouillage » bien.

En aparté, je vois que vous avez balisé Apache mais je voudrais vraiment vous recommander contenu statique par quelque chose comme

Autres conseils

Voir cette application pour générer des pouces.

Développé en Python, utilisant le serveur tornadoweb.

https://github.com/globocom/thumbor

pip install thumbor

Grande application

J'ai regardé ces réponses et même si ils travaillent, ils étaient tout simplement trop sofisticated pour moi. Si vous voulez juste un moyen rapide et sale pour obtenir des vignettes, juste en utilisant la bibliothèque PIL pourrait être un bon appel, voici mon code:

file, ext = os.path.splitext('image.jpg')
im = Image.open('/full/path/to/image.jpg')
im.thumbnail(size, Image.ANTIALIAS)
thumb_path = os.path.join('/full/path/to/thumb/dir/', file + ".thumb" + ".jpeg")
im.save(thumb_path)

Télécharger la bibliothèque PIL

Cheers, espère que cela aide quelqu'un.

Vous pouvez jeter un coup d'oeil à la documentation SORL-miniature . Je l'utilise dans presque tous mes projets en même temps que du contenu statique avec Nginx du /media/ dir:)

Consultez cette page de discussion sur la contribution des vignettes pour Django:

https://code.djangoproject.com/wiki/ThumbNails

J'ai eu exactement le même problème: dans un site à fort trafic, générant des dizaines de vignettes en temps de réponse est impossible, comme générer des vignettes pour tout le contenu passé en lots, donc je créé une application pour ça. Check it out: https://github.com/hcarvalhoalves/django-rest-thumbnails

Thumbor est en effet un grand service, vous pouvez utiliser django-thumbor sur django.

pip install django-thumbor

Repo ici: https://github.com/ricobl/django-thumbor

scroll top