Django Desenvolvimento web com Python e Igor Sobreira www.igorsobreira.com Globo.com
Licença Essa apresentação está som a licença Creative Commons Você pode copiar, distribuir e modificar... ...com a condição de citar a original nos créditos http://creativecommons.org/licenses/by/2.0/br/
quem sou eu? Igor Sobreira Desenvolvedor web na Globo.com Trabalho com Python e Django a ~ 4.5 anos
Python Por que é uma boa opção para web?
fácil de aprender comunidade ativa ótima documentação sintaxe simples e clara multiplataforma múltiplos paradigmas bibliotecas para tudo... tudo! tipagem dinâmica e forte várias implementações metaprogramação
PEP 8 Preocupação com legibilidade de código Padrão de identação: 4 espaços Nomenclatura de variáveis Uso de docstrings http://www.python.org/dev/peps/pep-0008/
Por que usar um framework?
O que precisamos? roteador de urls HTML, JSON, XML formulários persistência de dados segurança ( SQL injection, CSRF, XSS ) cookies/sessão e autenticação de usuários frameworks de teste
começar do zero usar componentes separados e montar nosso framework usar um framework full-stack Temos algumas opções...
“...you start by not trying to build a framework, but by building an application... As you develop further applications each one further refines the framework area of the code” http://martinfowler.com/bliki/HarvestedFramework.html Martin Fowler
Quero montar o meu framework Pylons CherryPy Werkzeug SQLAlchemy MongoEngine Jinja2 sugestões... Existe muita coisa no ecossistema... você vai encontrar o que precisa Tornado Storm Flask
Quero um framework completo web2py Plone sugestões... Django! TurboGears
Django
Criado em 2005 Lawrence, Kansas Lawrence Journal- World Licença BSD
DRY Don’t Repeat Yourself
Projeto == Várias aplicações south django-registration django-pagination django-debug-toolbar django-mailer django.contrib.admin django.contrib.comments django.contrib.sitemaps http://djangopackages.com/
Aplicações Coloque no path (PYTHONPATH) Coloque no INSTALLED_APPS no settings.py
Fácil de começar
$ pip install django $ django-admin.py startproject encurtador $ cd encurtador $ python manage.py runserver
Ótima documentação
Banco de Dados
ORM Mapeamento Objeto Relacional
Padrão Active Record Classe Tabela Cria tabelas a partir das classes Python python manage.py syncdb Consegue criar classes a partir de bancos legados python manage.py inspectdb
models.py
SQL do model anterior $ python manage.py syncdb
>>> palestra = Palestra.objects.get( ... palestrante__nome='Igor Sobreira') >>> Palestra.objects.all() [<Palestra: Desenvolvimento web com Django>] >>> palestra.titulo u'Desenvolvimento web com Django'
Herança múltipla Consultas lazy Facilmente extensível Tem como passar SQL manualmente Suporte a múltiplos bancos Suporte a bancos geográficos
Alterações nos dados e na modelagem Migrações Não existe suporte nativo Mas existem ótimas aplicações externas south
NoSQL Bancos de dados não relacionais
Ainda não existe suporte nativo Já foi iniciado no GSoC desse ano um backend para MongoDB Existem ótimas aplicações externas MongoEngine No Google App Engine usa-se o BigTable Porém... muitos módulos ainda dependem do ORM Admin, ModelAdmin...
URLs e Views
Requisição “^programação/$” urls.py def programacao(request): horarios = Horario.objects.all() return render_to_response( ‘programacao.html’, {‘horarios’: horarios}) views.py models.py Resposta
Urls aceitando vários formatos
View renderizando vários formatos
Admin Interface administrativa automática
admin.py
Linguagem pra criação de strings Templates
<!doctype html> <html> <head> <title> {% block title %}Palestrantes{% endblock %} </title> </head> <body> <h1> Palestrantes </h1> <ul> {% for palestrante in lista_palestrantes %} <li> {{ palestrante.nome }} </li> {% endfor %} </ul> </body> </html>
Banco de dados geográficos PostgreSQL / PostGIS Mysql Oracle Spatialite Manipulação de mapas no Admin GeoDjango
Cache Evite processamento desnecessário
O que cachear?
O site inteiro Basta adicionar middlewares no settings.py
Views específicas
Fragmentos de template
Objetos específicos
Onde cachear?
Memcached (mais recomendado) Banco de dados Arquivos Memória local É possível criar backends customizados ex.: Redis
Formulários Validação Internacionalização (i18n) e localização (l10n) Serialização de objetos (json, xml e yaml) Envio de e-mails Autenticação Upload de arquivos Muito mais...
Jython, implementação de Python em Java Rode django no seu container web favorito Glassfish, Tomcat, JBoss Use qualquer biblioteca no ecossistema Java Django roda na JVM
Testes Mantenha a qualidade do seu código
TDD - Test Driven Development Faça os testes antes da funcionalidade Ajuda a escrever menos código Ajuda a deixar o código mais modular Garante que o que foi feito funciona “Código não testado é código bugado”
Testes são muito importantes Django tem um bom suporte test runner embutido test client: uma maneira rápida de fazer requisições HTTP testes de envio de emails cria/remove banco de teste fixtures
Teste tudo! Não sabe o que testar? Teste tudo! Na dúvida se vale a pena testar? Teste tudo! Não sabe como testar? leia a documentação leia código de projetos bem testados
Testes isolados Não acessam banco de dados nem rede Não chamam métodos externos Usam mocks e stubs Faça testes unitários Use com moderação
Em linguagem natural Pyccuracy (http://pyccuracy.org) Lettuce (http://lettuce.it/) Ou em código python Selenium Splinter (http://github.com/cobrateam/splinter/) Faça testes com browser
Ambiente de desenvolvimento Isole seu projetos com ambientes virtuais
virtualenv Ambiente python isolado Cada projeto usa versões diferentes de pacotes python coloque cada um deles em um virtualenv Use pip para instalar pacotes virtualenvwrapper comandos úteis para gerenciar virtualenvs
[igor.sobreira@globo-mac:envs]$ virtualenv projeto_env --no-site-packages New python executable in projeto_env/bin/python Installing setuptools............done. [igor.sobreira@globo-mac:envs]$ cd projeto_env/ [igor.sobreira@globo-mac:projeto_env]$ source bin/activate (projeto_env)[igor.sobreira@globo-mac:projeto_env]$ ls bin include lib
Deployment Como colocar tudo isso no ar?
Python + Web WSGIWeb Server Gateway Interface
PEP 333 http://www.python.org/dev/peps/pep-0333/
def simple_app(environ, start_response): status = '200 OK' response_headers = [ ('Content-type', 'text/plain') ] start_response(status, response_headers) return ['Hello world!n'] variáveis de ambiente inicia a resposta informando status e headers retorna um iterável
PEP 3333 Versão atualizada da PEP 333 Melhorias para suportar Python 3.x Questões de strings e unicode que mudaram no Python 3 Compatível com a PEP 333 (Python 2.x) http://www.python.org/dev/peps/pep-3333/
PEP 444 http://www.python.org/dev/peps/pep-0444/
def simple_app(environ): status = b'200 OK' response_headers = [ (b'Content-type', b'text/plain') ] body = [b'Hello world!n'] return body, status, headers variáveis de ambiente retorna o corpo, status e cabeçalhos
Ainda não está definido o futuro do WSGI Mas a tendência é a PEP 3333 E num futuro um pouco mais distante o Web3 Acompanhe as discussões http://mail.python.org/mailman/listinfo/web-sig
Servidores web
mod_python mod_fastcgi mod_wsgi Apache Nginx fastcgi uWsgi gunicorn Mais opções: cherokee, lighttpd, etc
Consumo de memória: Nginx X Apache
http://python.org.br http://djangobrasil.org #python-br #django-br http://groups.google.com/group/django-brasil http://groups.yahoo.com/group/python-brasil/ Comunidade
#cobrateam irc.freenode.net http://cobrateam.info/ https://github.com/cobrateam
Obrigado Dúvidas? www.igorsobreira.com igor@igorsobreira.com Globo.com

Desenvolvimento web com python e django