Dúvidas mais comum do python

Quando temos o primeiro contato com a linguagem python, nos deparamos com alguns aspectos da linguagem que a torna confusa, principalmente quando comparada com outras linguagens.

Neste post esclarecerei algumas das dúvidas mais comuns do python.

if __name__ == “__main__”

Imagino que já deve ter se perguntado pela qual era a real necessidade de utilizar essa instrução nos scripts pyhton e a resposta é simples.

A módulo __name__ recebe o valor __main__ quando o script python é executado diretamente pelo shell.

No exemplo acima, o módulo __name__ do arquivo script.py receberá o valor __main__, porém caso seja realizado um import, o valor do __name__ corresponderá ao nome do pacote, nesse caso, “script”.

Para maiores esclarecimentos, leita este post.

Arquivos __init__.py dentro das pastas

Outra perola do python é os arquivos de inicialização, que tem como função identificar uma pasta como pacote na linguagem python.

Portanto, quando encontrar um arquivo __init__.py dentro de uma pasta, lembre-se que ela é um pacote, no entanto,  este arquivo não se limita apenas a indicar que uma pasta é apenas um pacote, ele também permite que seja executada instruções sempre que o pacote é importado.

Cade o switch?

Já deve ter procurado pelo switch no python, lamento informar que a linguagem não possui implementado no seu core, restando utilizar o if e elif.

Função Lambda

A Expressão lambda permite escrever funções anônimas em uma única linha de código. Exemplo:

Nota-se que não foi utilizado o return, isso é implícito em uma função lambda.

Else no for e while

Outro aspecto da linguagem que causa confusão em que já tem conhecimento em outra linguagem é a instrução else no for e while. Devemos compreender bem o seu funcionamento para que não seja induzido pela mesma correspondência do if.

Se você imaginou que o bloco de código correspondente ao else é executado quando o laço não é executado nenhuma vez, está completamente enganado. A instrução else no for e while é executado sempre, exceto quando utilizamos a instrução break no corpo do laço, sendo assim, caso não seja utilizado o break no corpo do for/while o else sempre será executado.

Herança múltipla

Isso mesmo que você ouviu, o python é uma das poucas linguagens que permite herança múltipla.

Métodos customizados de validação com jquery validation

Em outro post, demostrei como validar formulários utilizando o jquery validation, entretanto, neste post, irei abordar aspectos um pouco mais avançado, que é a criação de métodos customizados para validação.

Além dos métodos nativos, disponíveis no jquery validator, também podemos criar os nossos próprios métodos de validação e incorpora-los ao plugin, permitindo que ele se adapte a realidade da nossa aplicação.

Primeiros passos

Para criar nossa validação, basta chamar o método addMethod do jquery validator, passando com argumento três parâmetros, que são eles:

  1. Nome do método que será utilizado nas regras de validação, assim como, url, email.
  2. Método de validação, onde recebe 2 parâmetros obrigatórios: valor e elemento dom do campo. Também é possível receber um terceiro parâmetro em caso de validações que são necessários mais de um parâmetro de comparação. Ex: range(1, 5).
  3. Já no terceiro parâmetro é onde devemos informar a mensagem que será exibida caso os dados não sejam válidos.

Abaixo segue um exemplo de como adicionar métodos de validação ao plugin.

Obs: Nota-se que no método de validação é retornado this.optional( element ) ou sua validação, este método não é obrigatório, porém essencial para que seu método de validação possa ser reutilizado, ou seja, ao retornar this.optional passando o elemento, será ignorada sua regra de validação caso o campo não seja definido como obrigatório e seu valor mantenha-se vazio, porém no caso do usuário informar um caractere que seja, a validação será executada normalmente.

Utilizando os nossos métodos

Após criada nossa validação, o processo de utilização segue o mesmo critério dos métodos nativos do plugin.

Método de validação de cpf

Como brinde, deixo abaixo um dos métodos de validação que é mais comum no dia a dia, servindo como base para que você desenvolva seus próprios métodos.

Para utiliza-lo basta:

Até mais.

Operadores ternários em Python

Diferentes de outras linguagens que utiliza o operador ternário herdado da linguagem C, onde sua representação se dá pela sintaxe condição ? verdadeiro : false, o python possui uma sintaxe própria, porem que surte o mesmo efeito.

Operadores ternários na computação possuem origem na linguagem C, onde sua função é verificar uma condição e executar uma instrução caso a condição seja satisfeita ou outra caso contrario. Isso lhe parece familiar? Na verdade, operação ternária é uma simplificação do if e else, porém sua diferença está no fato da operação ser executada em uma única linha.

Abaixo temos uma expressão comum com if e else:

No código abaixo, utilizaremos operação ternária para executar a mesma função demonstrada acima:

Nota-se que não é utilizado os “:” após o if/else como na versão tradicional. Apesar da operação ternária parecer mais simples do que a condição comum do if/else, sempre devemos nos questionar o real motivo de utilizar este modelo, para que não sacrifique a legibilidade do seu código.

Dica: Utilize operação ternária apenas na atribuição de variáveis ou no momento da impressão de valores, evite utiliza-las “a tordo e a direito”, nesses casos opte pela forma tradicional, pois assim, garante o entendimento do seu código e evita bugs difíceis de serem rastreados.

Aprecie com moderação. 😀

Debugar aplicações django não seria tão fácil sem o debug toolbar

debug_toolbar
debug_toolbar

Demonstração do django debug toolbar

O django traz grandes facilidades, porém esconde perigos por trás dessa facilidade, e nisso está o uso excessivo de recursos por trás de toda automação que o framework proporciona, que ao invés de ajudar pode acabar atrapalhando. Entretanto para que possamos analisar os pontos fortes e fracos da nossa aplicação, precisamos de auxilio de alguma ferramenta de monitoramento e debug, e para tal tarefa temos o django debug toolbar.

Funcionamento da app

O django debug toolbar nos fornece a possibilidade de monitorar alguns recursos que são utilizados pelo django, como: tempo de utilização de cpu, versão do django, consultas sql que estão sendo executadas no banco, dentre outros. Para exibir os resultados das analises, a app exibe uma barra lateral em todas as páginas do seu projeto, no qual permite obter os dados relativo para cada página. Entretanto essa barra só é exibida enquanto a sua aplicação estiver em modo debug e para os endereços ips que forem autorizados.

Instalação e configuração

O primeiro passo é a instalação da debug toolbar, que é possível de duas formas: tanto pelo gerenciador de pacotes pip/easy_install, como baixando o pacote e instalando manualmente. Nesse exemplo optaremos por utilizar o gerenciador de pacotes para realizar a instalação.

ou utilizando o easy_install

Após realizada a instalação, precisamos apenas realizar algumas configurações para ativar o seu funcionamento e, a partir dai, consegui fazer uso dos seus recursos. No seu arquivo settings.py inclua os valores conforme demostrados abaixo:

Nesse momento daremos atenção a variável de configuração INTERNAL_IPS, essa é um configuração obrigatório para funcionamento da app, mesmo que seu projeto esteja em modo debug, se não definir os ips que serão permitido o uso da toolbar, ela não será exibido; isso porque, supondo que você possua um ambiente de homologação do seu projeto, e nesse ambiente o debug esteja ativado para facilitar o rastreamento de erros, porém esse ambiente é de acesso publico, sendo assim não há necessidade da toolbar ser exibida.

Configurações opcionais

Se você executou até os passos acima, sua debug toolbar já deve estar em funcionando perfeitamente, porém podemos customizar os recursos da ferramenta, uma configuração que costumo utilizar é, desativar a interceptação dos redirecionamentos, ou seja, a cada redirecionamento realizado, o django debug toolbar exibe uma tela intermediária onde mostra informações de debug para aquele processo, sendo necessário clicar em um botão para prosseguir com o redirecionamento.

Somente desative a interceptação dos redirecionamentos se tiver certeza que não há necessidade de monitorar os procedimentos antes de ser realizado o redirecionamento, geralmente desabilito apenas quando os redirecionamentos são realizados no painel admin.

Abaixo segue a tela de demonstração da analise dos sql que estão sendo executado na página.

Demo do analise do sql

Demo do analise do sql

O django debug toolbar não se limita apenas as opções pré configuradas em seu funcionamento, é possível ir muito além, desde profiles, até inclusão de novas extensões capazes de incrementar ainda mais a app. Para mais informações consulte o site do projeto

jQuery Lazy Load: Carregue as imagens do seu site apenas quando for necessário

Speed

website-speed-600x230

Hoje em dia, ter um site que ofereça um tempo de carregamento baixo não é mais algo restrito a grande projetos e sim uma obrigação de todos. O grande vilão, responsável na maioria das vezes pelo tempo de carregamento excessivo, são as imagens, devido principalmente a utilização de imagens sem nenhum tratamento apropriado para web, em sua grande maioria em sites dinâmicos, onde o responsável pelas publicações nem sempre tem conhecimento do impacto que uma imagem inadequada para web pode causar na performance do site.

Sendo assim, a cada dia novas técnicas são empregadas para que essa situação seja contornada, dentre elas se destaca o jquery lazy load. O plugin, atua de forma; que as imagens só seja carregadas quando estas tiverem em foco na área de visualização do navegador.

Benefícios ao utilizar jquery lazy load

O principal benefício em utilizar o plugin está relacionado a performance do site, como as imagens só são carregadas quando estiverem na área de visualização do browser, evita que o navegador carregue todas imagens utilizadas no seu site no momento em que a página é carregada, fazendo apenas requisições quando forem necessárias, veja nesse post os benefícios de possuir um site otimizado de Sergio Lopes.

Outro ponto importante, está nos sites que utilizam clould/cdn, onde estes serviços geralmente cobram pela transferência de dados na rede, sendo assim, carregando somente o necessário, você conseguirá reduzir os gastos.

Utilização do plugin

Antes de mais nada,  precisamos baixar o plugin e inclui-lo na página onde iremos utilizar. Lembrando que este plugin depende do jquery, portanto, tenha certeza que já possui no seu projeto.

Após inclusão do plugin iremos modificar as imagens no qual o plugin atuará.

Na exemplo logo acima, observamos que existe uma atributo adicional chamado data-original, é nesse atributo que deve ficar a referência para imagem original que só será exibida no momento em que o plugin achar necessário, já no atributo src devemos substituir por uma imagem alternativa (Imagem padrão, carregando e etc). Uma pratica comum utilizada pelos desenvolvedores, é criar uma imagem contendo apenas 1×1(px) transparente, afim de não ficar aquele icone padrão do navegador, utilizado quando uma imagem não foi encontrada.

Agora nos resta fazer o plugin trabalhar, neste caso basta chamar a função lazyload() no seletor jquery das imagens, onde queremos que o carregamento preguiçoso seja aplicado.

Também podemos atribuir parâmetros adicionais ao jquery lazy load, customizando a sua exibição.

Veja o demo do efeito fadeIn, para mais opções, consulte a página do projeto.

jQuery Lazy Load e ajax

Um problema comum encontrado por alguns desenvolvedores é utilizar o plugin em conteúdo carregado por ajax, sem precisar instanciar o método lazyload a cada callback da requisição.

Uma solução seria remover a classe das imagens que já foram carregadas pelo plugin e aciona-lo sempre que uma nova requisição for finalizada, para isso utilizaremos o seguinte código:

😀

Ativando o painel admin do django

login_django

Quem é recém chegado no django, encontra como novidade o seu painel administrativo pronto, mesmo que o visual é um pouco ultrapassado, este é um dos recursos que eu mais gosto no framework, principalmente, devido a sua simplicidade e velocidade com que é possível fazer um crud e até lógicas mais complexas, praticamente inacreditável.

Primeiros passos

Ativar o painel admin no django é um processo bastante simples, sendo necessário apenas modificar algumas linhas de código.  Primeiramente abra o arquivo settings.py e localize a variável INSTALLED_APPS, dentro da tupla que representa seu valor, deve-se localizar a linha que contém django.contrib.admin, descomente-a  conforme exemplo logo abaixo.

Após modificado o settings.py, devemos agora modificar o arquivo urls.py e ativar o roteamento do painel adminstrativo, para isso descomente as linhas, conforme marcação abaixo.

Nesse momento já temos nossa aplicação configurada para utilizar o painel administrativo, entretanto, caso você ainda não tenha sincronizado seu banco de dados, agora é obrigatório, então rode o seguinte comando:

Será criada todas as tabelas necessárias para uso do django, também será perguntado se deseja criar um usuário administrador, é importante realizar esta operações, pois, é com ele que você acessará o painel.

Todo processo necessário para poder utilizar o painel administrativo do django já foi realizado, agora nos resta apenas testar. Rode o servidor de desenvolvimento do django.

Abra no browser o endereço http://localhost:8000/admin/ e será então apresentada a tela de login, informe o usuário e senha que você utilizou quando executou o syncdb e congratulations.

django_painel_admin

 

Validação de formulários com jQuery Validation

form_validation

form_validation Validar formulários é uma das tarefas mais desgastantes no processo de desenvolvimento de software, entretanto, as aplicações web são os que mais precisam de atenção, pois temos algumas limitações que implicam na sua usabilidade: como internet, rede, diferentes tipos de navegadores e etc.

Nenhum usuário gosta de submeter seu formulário, aguardar alguns segundos, e só depois descobrir  que algum campo não foi preenchido corretamente, nos piores casos são as informações genéricas, onde é preciso decifrar qual foi o motivo do erro. Para facilitar nossas vidas e a dos usuários o pessoal da  http://bassistance.de/ desenvolveu o jquery validator , sendo este um excelente plugin jquery para validação de formulários client side.

Jquery Validation ou validação condicional do Html5

Hoje em dia o html5 não é nenhuma novidade e para cada projeto surge a mesma dúvida, devo utilizar a api do html5 ou jquery validator? Para responder este pergunta devemos levar me consideração alguns requisitos do seu projeto:

  1. Seus usuários utilizam apenas os browsers mais atuais.
  2. Seu projeto segue a risca um padrão de interface para validação dos formulários.

O problema principal de utilizar unicamente a validação do html5 está no fato, de ainda muitos usuários manterem seus browsers desatualizados, também temos o problema de cada browser tratar as validações de modo independente, sendo assim, você verá comportamentos diferentes para validações do html5 em cada navegador. Caso você queira utilizar a validação do html5 e manter uma compatibilidade com os browsers mais antigos, você pode adicionar uma pitada de moderniz no seu projeto.

Não é possível utilizar as validações do html5 em conjunto com o jquery validation, pois, o plugin inclui o atributo novalidate=”novalidate” no seu formulário, fazendo com que, a validação do seu formulário via api do html5 seja ignorada pelo navegador.

Primeiros passos com o jquery validation

Jquery validation depende do framework jquery, portanto, é necessário possui-lo no seu projeto, caso ainda não tenha é possível baixar-lo aqui. Nesse momento precisamos apenas incluir o plugin em nossa aplicação, isso é possível de duas maneiras, baixando a biblioteca no site do desenvolvedor ou utilizando o serviço de CDN.

Incluindo o jquery validation, a partir do código fonte em nosso projeto.

Caso opte por utilizar o serviço de cdn não será necessário baixar o plugin, apenas informar a url do serviço de cdn que o hospeda.

Compreendendo o funcionamento do plugin

Antes de mais nada, precisamos entender detalhadamente o funcionamento do plugin, o exemplo abaixo demostra um simples uso do jquery validation.

Nota-se que apenas foi informado o seletor do formulário, que nesse caso pode ser qualquer seletor jquery valido, dai então é invocado o método validate que será responsável pela validação do nosso formulário. O método validate recebe como parâmetro um objeto literal do javascript onde estes serão os parâmetros que definirão o comportamento do plugin na sua aplicação. Daremos atenção apenas a três atributos em especial, que já são mais que suficientes para utiliza-lo no seu dia a dia.

Caso deseje conhecer as opções disponíveis do método validate consulte esse link.

1. Debug pode não parecer importante, mas o atributo debug é extremamente útil quando estamos incluindo nossas regras de validações e realizando testes; pois quando esse atributo é definido como true, ele evita que o formulário seja submetido, mesmo no caso, em que todos os campos foram preenchidos corretamente, já em caso de erro dispara todas mensagens de debug  no console do browser.

2. rules este é o parâmetro mais importante, pois é nele que definimos as nossas regras de validações. O parâmetro rules espera receber as regras de validação para cada campo do seu formulário, no qual o seu identificador é o atributo name, já o seu valor é um objeto que contenha todas as regras de validação para o seletor em questão. Caso o atributo name do campo do seu form não satisfaça a sintaxe para declaração de variáveis em javascript, é possível utilizar string ao invés de literal, conforme exemplo abaixo.

Regras de validação disponíveis:

  • required – Indica que o campo é de preenchimento obrigatório, um espaço em branco elimina essa validação.
  • remote – Valida um campo a partir de uma validação remota. Ex: verificar se um e-mail já está cadastrado no sistema
  • minlength – Determina a quantidade mínima de caracteres.
  • maxlength – Determina a quantidade máxima de caracteres.
  • rangelength – Especifica que um elemento deve possuir uma faixa de caracteres.
  • min – Determina um valor mínimo.
  • max – Determina umvalor máximo máximo.
  • range – Determina uma faixa de valor.
  • email – E-mail
  • url – Url, com ou sem http
  • date – Determina que o valor informado seja uma data válida.
  • dateISO – Obrigatoriamente o formato da data deve ser um padrão iso .
  • number – Valor deve ser de números decimais. Aceita caractere “.”(ponto)
  • digits – Apenas dígitos.
  • creditcard – Números de cartões de crédito
  • equalTo – Compara o valor do campo com valor de outro elemento. Ex: Verificar senha e repita a senha são iguais.

3. messages O plugin possuí mensagens de validação padrão para cada regra, sendo estas no idioma inglês, porém também é possível incluir um pacote que traduz as mensagens para o idioma padrão do seu sistema, consulte os locations disponíveis para o jquery validator.

Entretanto, mesmo utilizando o location para o seu idioma, algumas mensagens podem ser personalizadas para cada regra de validação. Veja o exemplo abaixo:

Validando o primeiro formulário

O código abaixo é um exemplo de como validar o seu formulário com jquery validor, utilizando apenas os conceitos descritos nesse post, aspectos avançados foram deixados de lado para uma melhor compreensão do funcionamento do plugin.

Para mais informações, consulte a documentação do plugin.

Alguns sites de sucesso escrito em python e django para você se inspirar

Sempre quis aprender python e django? mas nunca ouviu falar de projetos de sucesso que o utilizam? então vou listar alguns sites de sucesso que adotaram o  django e não se arrependeram.

  1. globo.com, uma das empresas brasileiras que mais aposta no django, sendo a maioria dos seus produtos desenvolvidos utilizando o framework, dentre eles destacam-se g1tvgdomingaodofaustao, caldeiraodohuck.
  2. Instagram, rede social com mais de 100 milhões de usuários, recentemente adquirida pelo facebook.
  3. Disqus,  serviço online que oferece uma plataforma centralizada de discussões e postagem de comentários para sites, bastante utilizada em blog, portais de notícias e inclusive neste blog.
  4. Pinterest, rede social de compartilhamento de fotos, que conta atualmente com mais de 25 milhões de usuários cadastrados.
  5. Bitbucket, serviço de hospedagem para projetos versionados pelo mercurial ou git, concorrente direto do github.
  6. Musio – Site de música que visa divulgar artistas independentes.

E agora, já se sente confiante para aventurar nas águas do python e django?.

Minhas ferramentas de trabalho – Parte 1

victorinox-presentation-master-1339183474469_1920x1080

victorinox-presentation-master-1339183474469_1920x1080

Cada desenvolvedor possui aquelas ferramentas que mais amam, alguns devido a recomendação de outros profissionais, já outras por afinidade. Nesse post vou listar algumas das ferramentas que utilizo no meu dia a dia.

1 – Sistema Operacional

Sem sombra de dúvidas eu uso linux tanto no trabalho como no dia a dia. Ultimamente tenho usado fortemente o ubuntu, porem gosto muito do debian, ambos sistemas operacionais são muito bons: estabilidade, leveza, facilidade no gerenciamento de pacotes, dentre outros mil motivos. Minhas experiencias com windows nao são das melhores, pior ainda com o windows 8, que neste ultimo tive dificuldades até para desligar, onde tive que pesquisar na web como realizar o procedimento, não sei se nesse caso o erro foi meu, por não conhecer o sistema ou da microsoft por dificultar as coisas  “fico com a ultima” :D.

2 – IDEs

Quando inicie, utilizei por muito tempo o netbeans, que por sinal é uma excelente IDE, tempos depois comecei a trabalhar com java e como consequência também adotei o eclipse, outra IDE muito boa. Já para python sempre utilizei o eclipse com pydev, que é sensacional, no entanto nem toda maquina supre as necessidades de hardware para manter muitos softwares pesados aberto, foi nesse meio termo que resolvi buscar algo mais leve que suprisse pelo menos minha necessidade para trabalhar com python, foi ai que conheci o sublime text, no início não fui muito com a cara dele, me pareceu algo amador, entretanto ao conhecer o poder dele fiquei surpreso, logo instalei alguns plugins e modifiquei algumas configurações e tudo passou a ficar lindo, fiquei maravilhado e agora faz parte do meu canivete suíço, hoje em dia tenho apenas o eclipse e sublime text como editores.

3 – Terminal

Muitos acham programadores loucos por preferir mais a linha de comando do que interface gráfica, conheço alguns que até gravar cd/dvd pela linha de comando, não sou desses, mas terminal hoje é um componente obrigatório na minha vida profissional.

4 – Git

Trabalhei um bom tempo sem utilizar nenhum controle de versão, comecei a ver vários programadores mais experientes falandoe resolvi então pesquisar sobre o assunto, meu primeiro contato não foi dos melhores, tive bastante dificuldade, até porque nunca tinha utilizado nenhum software para controle de versão. Porém logo depois que acostumei, fiquei maravilhado com o poder do danado. Já hoje em dia, não digito nenhuma linha de código sem ele e até fico doente ao trabalhar em um projeto que não esteja versionado.

Nos próximos post falarei sobre mais ferramentas e dedicarei um, exclusivamente para falar sobre navegador.

Auto relacionamento no Django

Auto relacionamento é bastante comum quando necessitamos de utilizar um determinado modelo de forma recursiva, nesse caso é impossível de se criar outras tabelas, pois não sabemos exatamente o nível de profundidade no qual esse relacionamento pode chegar.

Um exemplo ideal para compreendermos a necessidade de auto relacionamento são nas lojas virtuais, onde um determinado departamento possuí varias subcategorias e essas subcategorias podem ou não possuir mais subcategorias e assim sucessivamente, nesse modelo se torna impraticável a criação de novas tabelas para representar essas subcategorias, pois não sabemos até onde podemos chegar.

Construindo auto relacionamento no django

Vamos nesse momento criar o model responsável pelo auto relacionamento :

É possível observar que o atributo parent faz um relacionamento para self, ou seja, para si mesmo, nesse momento já temos um auto relacionamento. Agora já é possível obter a categoria no qual uma subcategoria pertence, porém necessitamos também do processo inverso, onde será possível obter as subcategorias a partir de uma determinada categoria. É ai que entra em jogo o parâmetro related_name,  esse indica qual será o atributo utilizado no processo inverso de relacionamento e o seu valor representa o nome do atributo a ser utilizado na obtenção das subcategorias.