Pergunta

Eu gostaria de criar dinamicamente miniaturas com base em parâmetros no URL. Por exemplo, http://mysite.com/images/1234/120x45.jpg criaria um 120x45 Miniatura para ID da imagem 1234.

A solução óbvia para isso é ter uma visão de Django que faça o seguinte:

  1. Procure uma versão previamente em cache da imagem neste tamanho.
  2. Crie uma miniatura se não for armazenada em cache (alguma lógica para bloqueio, para que apenas 1 processo crie a miniatura e outros processos aguardam).
  3. Pipa os resultados através do Django.

Isso deve "funcionar", mas estou preocupado com o desempenho. Não gosto da ideia de usar o Django para servir conteúdo estático. Quais são algumas outras maneiras de realizar esse problema?

Foi útil?

Solução

Você não precisa usar o Django para servir o conteúdo estático diretamente. Basta ter o seu servidor Rota 404 solicitações para sua pasta de imagens para uma visualização do Django, onde divide o nome do arquivo e gera a miniatura apropriada, antes de redirecionar de volta para o URL original (que, esperançosamente, não será mais um 404).

Quanto à sugestão do Django-ImageKit da outra resposta, não tenho certeza de que faça qualquer coisa para deixar você dinamicamente Gere os polegares de imagem com base no URL, mas eu certamente recomendo usá -lo para todos os recursos que ele possui.

Editar:

Quanto à estrutura real da URL, sinto -me mais típico /images/filename-120x45.jpg permitiria filtrar mais facilmente 404 solicitações que não têm nada a ver com a geração dinâmica de miniatura. Diga, por exemplo, que existem toneladas de 404 erros para /images/original_size_image.jpg. Você não gostaria que aqueles fossem roteados para o Django, e só poderia corresponder aos nomes de arquivos desse formato com Regex. End Edit

Você deve ter cuidado para que alguém ciente desse recurso spam seu aplicativo django. Eles poderiam potencialmente matá -lo com um número infinito de tamanho de imagem e combinações de nome de arquivo na ponta dos dedos. Você precisaria descobrir como colocar limites superiores nessas solicitações, como redirecionar de volta para um 404 se qualquer uma dimensão for maior que a original, ou até mesmo descobrir como limitar solicitações para várias dimensões da mesma imagem. Talvez tenha sido isso que você estava conseguindo ao mencionar "bloqueio".

Como um aparte, vejo que você marcou o Apache, mas eu realmente gostaria de recomendar que você sirva conteúdo estático através de algo como Nginx. Talvez você possa negar a sobrecarga extra das solicitações de imagem dinâmica se usar um servidor de arquivos estático que não seja uma porcaria completa no atendimento de arquivos estáticos.

Outras dicas

Você também pode tentar Sorl, está sendo usado por Satchmo.

Veja este aplicativo para gerar polegares.

Desenvolvido em Python, usando o servidor Tornadoweb.

https://github.com/globocom/thumbor

pip install thumbor

Ótima aplicação

Eu olhei para cima essas respostas e, embora elas funcionem, eles eram muito sofisticados para mim. Se você deseja apenas uma maneira rápida e suja de obter miniaturas, apenas usar a biblioteca PIL pode ser uma boa ligação, este é o meu código:

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)

Baixe a biblioteca PIL aqui

Saúde, espera que isso ajude alguém.

Você pode dar uma olhada em A documentação da THE SORL-THUMBNAIL. Eu o uso em quase todos os meus projetos, juntamente com servir conteúdo estático com nginx do /media/ DIR :)

Confira esta página de discussão sobre a contribuição da miniatura para o Django:

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

Eu tive o mesmo problema exato: em um site de alto tráfego, gerar dezenas de miniaturas no tempo de resposta não é viável, assim como a geração de miniaturas para todo o conteúdo passado em lote, então criei um aplicativo para isso. Confira: https://github.com/hcarvaloalves/django-rest-thumbnails

Thumbor é realmente um ótimo serviço, você pode usar o Django-Thumbor no Django.

pip install django-thumbor

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

Pode ser necessário redimensionar a imagem em exibição, com base na dimensão especificada necessária, sob demanda. o Django ImageFit A biblioteca faz exatamente isso e também dá a possibilidade de cortar.

No seu exemplo, você escreveria {{ 'http://example.com/images/1234.jpg'|resize:'120x45' }} E você terminaria com uma imagem de tamanho de 120x45.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top