Pesquisar este blog

sexta-feira, 5 de fevereiro de 2010

Como tornar seu projeto django mais rápido!

Hoje a postagem é direcionada para quem já sabe django e quer melhorar o desempenho de uma aplicação sua. Existem diversas formas de se melhorar o desempenho geral de uma aplicação Django, entretanto, vou falar de duas técnicas bastante simples e eficazes. 

Quando se fala em melhorar o desempenho de uma aplicação, desenvolvedores com background em outras linguagens e frameworks logo pensam em adicionar cache e "melhorar o sql" das consultas. Em Django, esta não é uma forma eficiente de fazer as coisas. 

O fato de nem todo site necessitar de cache e do cache, às vezes, não poder ser usado, por possibilitar retornar dados previamente carregados quando a última informação do banco deve ser mostrada sempre, são argumentos pertinentes contra o uso de cache. Quanto a melhorar o SQL, em Django, que possui um ORM poderoso, responsável por cuidar de todo o SQL gerado, esse se torna uma melhoria que muitas vezes terá impacto imperceptível. Se você não estiver bastante conciente sobre os acessos mais comuns ao seu site e sobre a complexidade de suas querys, outras formas mais simples de melhoramento podem ser adicionadas ao seu projeto.

Evite usar locals()

No Django, normalmente, cada view é uma função responsável por receber uma requisição e retornar uma resposta adequada. A forma mais usual de retornar essas respostas é através da função render_to_response, que se encarrega de carregar o arquivo com o template Django, populá-lo com os dados de um dicionário e retorná-lo utilizando o mimetype adequado. O problema aqui está na forma como o render_to_response pode ser usado.  Vejamos a assinatura do método:
render_to_response(template[, dictionary][, context_instance][, mimetype])
Assinatura simples, com poucos argumentos. template é o nome do arquivo (html, por exemplo) que será renderizado, enquanto dictionary é um dicionário com todas as variáveis que serão disponibilizadas no template. O problema ocorre quando, para o argumento dictionary, é usado o resultado do método locals(), que retorna todas as variáveis locais. Isso ocasiona que, ao invés de usar apenas as variáveis pertinentes na renderização do template, tudo que estiver como variável local também será fornecido como argumento, tornando a busca de valores das variáveis menos eficiente e diminuindo a qualidade do código. Então, primeira regra, não use o locals no render_to_response. 

Utilize o middleware Gzip

A utilização do middleware Gzip é uma das formas mais fáceis e rápidas de melhorar o desempenho geral de um projeto django. A integração deste middleware no seu projeto fará com que os dados enviados ao navegador do usuário sejam compactados com gzip antes de ser enviados. Isso permite diminuir o tráfico geral de dados consideravelmente. Como adicionar o middleware gzip a um projeto é muito fácil, ele é a melhor forma de melhorar o desempenho de um projeto rápidamente. 

Para adicioná-lo a um projeto, edite o arquivo settings.py adicionado:

'django.middleware.gzip.GZipMiddleware',

ao seu dicionário MIDDLEWARE_CLASSES.

Além destas duas dicas simples, outras formas de melhorar o desempenho do seu site são:
  • utilizar o wsgi em detrimento ao mod_python
  • servir o conteúdo estático do seu site diretamente pelo servidor
  • não utilizar o método len() em querysets sem necessidade
Bem senhores, é isso. Espero ter ajudado. Abraço e comentem!

Nenhum comentário:

Postar um comentário