21 de dezembro de 2012

Diferenças entre Django e Web2py

Artigo atualizado em 14/02/2016.

Uma pergunta recorrente na lista Python Brasil é: "qual é o melhor framework web para Python?".

Existe quase que um consenso a respeito da qualidade dos frameworks web em Python: eles vão resolver o seu problema. Cada um com seu estilo, mas você não vai ficar na mão. Eles estão sendo atualizados e suas comunidades são bem ativas.

Mas o que seria uma boa notícia, traz um inconveniente: se todos são bons, qual escolher?

Segue abaixo uma lista não exaustiva, escrita com minhas opiniões a respeito das diferenças entre Web2py e Django, dois web frameworks que te ajudam ou te atrapalham no dia-a-dia.

Nota: se você tem dúvidas sobre o que é um framework fullstack, leia Qual a diferença entre framework fullstack e microframework?. Se você quiser saber mais um pouco sobre as vantagens e desvantagens dos frameworks fullstack, leia Uma Visão sobre Frameworks Fullstack.

Django tem mais mercado de trabalho. Se você ler uma oferta de vaga para Python que cite um framework, vai ler Django nela. Portanto, se você quer escolher o framework baseado na quantidade de vagas do mercado, pode parar de ler esse post aqui mesmo. Sua escolha é Django. Bons estudos, djangonauta. Mas se você quer conhecer um pouco mais sobre abordagens diferentes, vamos continuar.

A primeira diferença é de nomenclatura. O Web2py usa o conceito MVC (Model-View-Controller) comum, amplamente conhecido. O Django usa o MVT (Model-View-Template). Ou seja, o que todos chamam de View, o Django chama de Template. O que todos chamam de Controller, o Django chama de View.

O Django tem uma abordagem bem linha de comando. Seguindo a tendência da maioria dos frameworks modernos (também o Web2py), ele trabalha com "convention over configuration". Como sabemos, essa abordagem acelera o início do desenvolvimento e deixa a estrutura da aplicação mais clara. O Web2py deixa você fazer algumas coisas por uma interface web. Se você quiser é possível editar todo seu projeto pela web, no servidor local de testes. Você não é obrigado a fazer assim, mas pode se quiser.

O Django adere ao conceito "explicit is better than implicit". Isso significa que em toda view (o que o Web2py e o resto do mundo chamam de controller) você terá que escrever os imports necessários, mesmo para os módulos do próprio Django. O Web2py adere ao "practicality beats purity" e te deixa usar a infra-estrutura dele sem precisar dos imports. Por exemplo, basta usar request, response e session, por exemplo, que são objetos globais já disponíveis para toda a aplicação. Também para helpers da view (templates no Django) e infra-estrutura de internacionalização (muito simples, por sinal).

Tanto o Django quanto o Web2py têm uma forma de acessar seus dados sem escrever SQL. O Django usa um ORM (Object-relational Mapping) e o Web2py usa a PyDal (Data Abstraction Layer). De prático, a DAL te permite escrever comandos de uma forma mais clara, para o meu gosto pessoal. A abordagem do Django é mais OO, porque para escrever um Model, você precisa de uma classe. No Web2py você define sua tabela chamando uma function.

O Web2py já traz algumas coisas prontas que facilitam sua vida, como o grid, que é um componente que você consegue escrever um CRUD com 1 linha de código e te dá pesquisa de brinde. Traz um wiki embutido bastante prático também, mas não tem nada comparável ao admin do Django. O admin do Web2py, apesar de ter o mesmo nome, tem uma proposta diferente, o que frustra alguns iniciantes que não estão atentos à nomenclatura. Ele se propõe a adminstrar sua aplicação, ao invés de servir de plataforma para administrar eficientemente os dados sobre os quais ela atua, apesar de fazer isso de forma básica.

O Django exige que você escreva um mapeamento de URLs para cada URL do seu aplicativo, o que é bem útil em muitos casos de sistemas grandes. O Web2py também suporta essa forma de trabalhar, mas, por padrão, ele infere qual controller/function é executado pela URL informada, evitando que você precise escrever seu mapeamento de URLs logo de cara. Isso ajuda a diminuir o tempo de entrega, adiando decisões que podem não ser importantes no início.

O Web2py traz migrations transparentes já embutidas no próprio framework. Elas são mão na roda, deixando que você pratique baby steps em seu esquema de banco de dados de forma natural, sem recorrer a plugins ou comandos adicionais. O Django ainda não traz isso nativamente, mas não é por acaso que o South faz muito sucesso. O poder das migrations do South é inegável. traz esse recurso na versão 1.7, mas ainda precisa de intervenção do desenvolvedor. O Web2py roda as migrations automaticamente.

Outra diferença é que nos templates do Django, você não escreve código Python. Ele trabalha com uma linguagem de templates que tende a restringir o que é possível fazer neles. O Web2py deixa você usar código Python nas views (equivalentes aos templates do Django). Ambas abordagens têm seus pontos fortes e fracos. Eu, pessoalmente, gosto de ter o poder para usá-lo quando for conveniente. Portanto, prefiro poder escrever código Python onde for possível. Por outro lado, a linguagem de templates do Django tem filtros bastante úteis, coisa que você não vai ter no Web2py.

O Django já suporta oficialmente Python 3. O Web2py ainda está restrito ao Python 2.6 e 2.7. Existe um movimento na lista de desenvolvedores do Web2py para deixar a versão 2.6 e focar no Python 3, mas isso ainda não é uma realidade (em 14/10/2015).

Muita gente recrimina o Web2py porque ele faz "mágicas" para simplificar sua vida (o lance dos imports que citei antes) e usa exec e eval para rodar seu código. No entanto, para o perfil comum de aplicativos que fazemos na web, não vejo problema real com isso.

Com o Django você vai ter o benefício de encontrar praticamente de tudo já desenvolvido pela comunidade. E sem dúvida, a comunidade Django é muito maior do que a de qualquer outro framework. Só não me arrisco a compará-la com a comunidade Plone, por causa da idade dele.

Estou aqui pontuando alguns itens de uma forma não apaixonada para te mostrar que, no final das contas, o que vai contar mesmo é o seu estilo pessoal, quando você puder optar por qual framework usar.

Pessoalmente, gosto da abordagem mais pragmática do Web2py, mas é importante levar em consideração o perfil dos projetos e de seus objetivos pessoais.


Existe uma opinião a respeito da longevidade do projeto. Se você está escrevendo alguma coisa para durar muito tempo, alguns colegas defendem o uso do Pyramid.

Alguns acham que para projetos que precisam escalar logo de cara, o Flask deve ser escolhido.

No mais, apesar de essa sugestão ser frustrante, a dica é você pegar um tutorial de cada um framework e fazer seus testes. Entre na lista de cada um deles e acompanhe as mensagens por uns dias e veja o que você consegue tirar de conclusão.

O importante, para mim, é você sentir-se bem atendido, mas sabendo que não existe uma alternativa perfeita para todos os casos. Não compartilho do pensamento "one size fits all".

Qualquer um desses frameworks que você escolher terá uma comunidade pronta para te ajudar, como acontece no mundo Python. Mas sempre vale a dica de ler a documentação antes e também pesquisar o histórico de perguntas da lista.

Se você está procurando cursos, veja esses links:

Eu sou Vinicius Assef, um programador do século passado que gosta de Python, pratica Lean Development e acredita em Deus. Você pode me contactar por email ou twitter.

20 comentários:

  1. Parabéns pelo post, uma das maiores dúvidas que qualquer iniciante de Python, assim como eu, tem ao escolher um framework para aprender e trabalhar. Por coincidência irei fazer o curso de Web2py do amigo Bruno Rocha, uma das referencias em Python, tanto que também desejo de acordo com o tempo estudar o Django. Felizmente a comunidade Open-source está em constante crescimento, tendo diversas tecnologias e ferramentas de alta qualidade. Obrigado por criar esse post no qual ilustra bem quais caminhos optaremos ao escolher nossas ferramentas. Grande abraço.

    ResponderExcluir
  2. Ótimo post!! Hoje tenho dado mais atenção à frameworks minimalistas como cherrypy e flask, acho que vale a pena...

    ResponderExcluir
  3. Lembrando que já se encontra no trunk a nova interface administrativa do web2py trazendo melhorias.

    ResponderExcluir
  4. Belo post! Para principiantes são excelentes as informações mencionadas. Trabalho com python há 8 anos e já estudei vários frameworks. Hoje trabalho somente com Django pelo simples motivo de haver uma comunidade muito atenciosa aos exemplos e explicações e com tudo o admin que posso passar para meu cliente atualizar seu site. Já experimentei o Web2py e poderia usá-lo em um projeto bem pequeno, porém não tive oportunidade.

    ResponderExcluir
  5. Ótimo post, bem explicativo, só um conselho, não use essa linguagem de adolescente usuário do orkut e cheio de espinha to tipo "vc" nos seus posts, não mate nosso idioma, use "você".

    ResponderExcluir
  6. Interessante que todo escroto que faz comentário nada construtivo sempre o faz utilizando "Anônimo", poderia sim era fazer um post melhor e deixar aqui o link com seu texto de adulto que não usa redes sociais para compararmos se tem capacidade e iniciativa para fazer mais do que criticar gratuitamente... com relação ao post, muito boas as dicas e as explicações sobre as diferenças. Não mude seu estilo, pois sabemos compreender que seu objetivo é compartilhar informações de maneira clara e com uma linguagem coerente com o público alvo. Viva o SL e o Python! Valeu! :)

    ResponderExcluir
  7. Vc tem um tutorial da IDE Eric4 com Web2py?

    ResponderExcluir
    Respostas
    1. Não, Anônimo, não tenho. Eu não uso IDE.

      Excluir
  8. Achei o post interessante.. Mas achei vc bem tendencioso quanto ao Web2py.

    Mesmo também preferindo o Web2py para implementações pequenas, não escolheria para um projeto de grande porte. Acho q nada fica muito claro no Web2py depois q umas 5 ou 6 pessoas mexeram no código. Acho o Web2py meio "nebuloso".

    Parabéns pelo post. É uma ótima dica para um projeto pequeno..

    ResponderExcluir
    Respostas
    1. Olá Anônimo.

      Sim, eu prefiro a abordagem do Web2py. Eu falo isso num parágrafo aí no post.

      A propósito, eu recomendei que as pessoas façam seus testes para ver qual alternativa é a melhor solução para elas.

      Repetindo o que escrevi no código, não acho que "one size fits all".

      Excluir
    2. Corrigindo...
      "escrevi no código", não. Escrevi no post. ;-)

      Excluir
  9. Eu programei muito em clipper e minha carreira de programador morreu em 2005 com palms:-( Programei um pouco em C, minha cabeça é muito procidural ainda. No meu emprego usam django. O que vc recomenda até eu aprender o paradigma de objeto?

    ResponderExcluir
  10. Olá Mauro. Eu recomendo 3 coisas:
    1) Não se intimide.
    2) Programe.
    3) Estude.


    Siga tutoriais, exemplos, veja código de outras pessoas.
    Além disso, estude. Leia livros, assista palestras e videos.

    Ou seja, não pare, programe e estude. Usar uma ferramenta orietada a objetos não é difícil. A coisa começa a complicar quando você precisa desenvolver hierarquias e conjuntos de classes. Mas isso vem com o tempo através da prática e dos estudos.

    Enfim, programe. A prática vai ajudar a entender a teoria.

    ResponderExcluir
  11. Gostaria muito de ter tido esta aula alguns anos atrás.
    Testei os dois é lógico que fiquei com o segundo da minha escolha, mas perdi muito tempo tentando desenvolver com o primeiro,
    e quase desisti do meu projeto devido as dificuldades de adaptação.
    Não vou citar a minha escolha para não ser "tendencioso".
    Hoje posso dizer que está fluindo muito bem.
    Todas as dificuldades que tive fui prontamente auxiliado por ambos grupos.
    Novamente parabens por este post.

    ResponderExcluir
  12. Obrigado pelo artigo! Está me servindo como bússola pra começar no mundo Python.

    ResponderExcluir
  13. Vinícius obrigado pelas informações tão valiosas. Para quem está começando, assim como eu, é muito importante conhecer as diferenças. Abraço.

    ResponderExcluir

Marcadores