Python mudando o modo de Python mudando o modo de desenvolver para a internetdesenvolver para a internet
Marcos Daniel Petry
Quem sou eu?Quem sou eu?
• Marcos Daniel Petry =)• Bacharel em Ciências da Computação• Desenvolvedor Python desde 2005• Já programei em Delphi, VB, PHP, Java ...
Quem está aí?Quem está aí?
• Desenvolvedores?• Conhecem python?• Trabalham com python?
Há muito tempo atrás...Há muito tempo atrás...
• Não havia um estrutura determinada• Poucos padrões• O objetivo era muito diferente do que é hoje• Necessidade de algo melhor...
Iniciada a evolução...Iniciada a evolução...
• Não é necessário escrever todo html "no braço"
• O servidor Web Recebe a requisição
• Executa o código CGI e devolve a informação processada
• Possibilidade de usar C, Perl, TCL....
A era PHP e ASPA era PHP e ASP
• Inicio da divisão de culturas – Software proprietário x Software livre– "guerra de linguagens"
• O mesmo objetivo de CGI, mas com uma melhor tecnologia e mais fácil de entender
• Os sites são orientados a páginas• Várias iniciativas de integrar outras linguagens
com o servidor Web
=(=(
=(((=(((
Precisamos trabalhar com Precisamos trabalhar com aplicações e não páginas!aplicações e não páginas!
Frameworks!Frameworks!
Mas por que Python?Mas por que Python?
• Criada para ser explícita e de fácil aprendizado• Orientada a Objetos, mas multi-paradigma• Multi-plataforma• Software Livre• Compilada, interpretada e interativa• Muitas bibliotecas• Curva de aprendizado curta• Divertida!
SegurançaSegurança• Por Linguagem:• Python: 82• PHP: 11899
Joomla Drupal Zend Cake Zope Plone Django0
100
200
300
400
500
600
700
Dados da National Vulnerability Database, em 18/06/2010
http://web.nvd.nist.gov/view/vuln/search
O Resultado?O Resultado?
O que é necessário para um Framework O que é necessário para um Framework WEB?WEB?
• Alto nível
• Orientado a aplicações
• Que respeite um paradigma de projeto
• Desenvolvimento rápido
• Open Source =)
Como conseguimos isso?Como conseguimos isso?
• Mapemento objeto-relacional• Mapeador de URL• Sistema de Templates• Ferramentas auxiliares
– Formulários e Validação– Autenticação– Controle de sessões– Administração
Resultado?Resultado?
• Rápida implementação• Facil manutenção
Mapeamento Objeto-RelacionalMapeamento Objeto-Relacional
• Escrever SQL é descecessário na maioria dos casos• Independência de Banco de Dados
• Existem vários, independente do framework escolhido– SQL Objetct– Alchemy– Mongo-Engine– Divan
Mapeamento Objeto-RelacionalMapeamento Objeto-Relacional
class Person(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30)
CREATE TABLE myapp_person ( "id" serial NOT NULL PRIMARY KEY, "first_name" varchar(30) NOT NULL, "last_name" varchar(30) NOT NULL);
Mapeamento Objeto-RelacionalMapeamento Objeto-Relacional
class Person(models.Model): name = models.CharField(max_length=128) def __unicode__(self): return self.name
class Group(models.Model): name = models.CharField(max_length=128) members = models.ManyToManyField(Person, through='Membership') def __unicode__(self): return self.name
class Membership(models.Model): person = models.ForeignKey(Person) group = models.ForeignKey(Group) date_joined = models.DateField() invite_reason = models.CharField(max_length=64)
Mapeamento Objeto-RelacionalMapeamento Objeto-Relacional>>> ringo = Person.objects.create(name="Ringo Starr")
>>> paul = Person.objects.create(name="Paul McCartney")
>>> beatles = Group.objects.create(name="The Beatles")
>>> m1 = Membership(person=ringo, group=beatles,
... date_joined=date(1962, 8, 16),
... invite_reason= "Needed a new drummer.")
>>> m1.save()
>>> beatles.members.all()
[<Person: Ringo Starr>]
>>> ringo.group_set.all()
[<Group: The Beatles>]
>>> m2 = Membership.objects.create(person=paul, group=beatles,
... date_joined=date(1960, 8, 1),
... invite_reason= "Wanted to form a band.")
>>> beatles.members.all()
[<Person: Ringo Starr>, <Person: Paul McCartney>]
Mapeador de EndereçosMapeador de Endereços
• Mantém a estrutura do seu site controlada– Mais segurança
• Mais fácil de debugar em caso de erro no site• Endereços fáceis de entender
Mapeador de EndereçosMapeador de Endereços
urlpatterns = patterns('noticias.views',
url(r'^$', 'index', name="prindex"),
url(r'^noticia/(?P<secao>)/(?P<categoria>)/$', 'secao', name="notsecao"),
url(r'^noticia/(?P<nome>[\\d\w]+).html$', 'artigo', name='notdetalhe'),
)
Mapeador de Endereços - Resultado?Mapeador de Endereços - Resultado?
http://www.meusite.com/noticias.php?secao=12&categoria=12
http://www.meusite.com/noticias_ver.php?id=12
Mapeador de Endereços - Resultado?Mapeador de Endereços - Resultado?
http://www.meusite.com/noticias.php?secao=12&categoria=12
http://www.meusite.com/noticias_ver.php?id=12
http://www.meusite.com/noticias/esportes/selecao/
http://www.meusite.com/noticias/selecao-brasileira-ganha-da-coreia-do-norte.html
Sistema de TemplatesSistema de Templates
• Separação de código e layout
• Existem vários, independente do framework escolhido– Cheetah– Genshi– Jinja– Mako – ...
Sistema de TemplatesSistema de Templates{% extends "base_templ.html" %}
{% block title %}{{ titulo }}{% endblock %}
{% block content %}
<h1>{{ titulo }}</h1>
{% for noticia in noticias_lista %}
<h2>
<a href="{{ noticia.get_absolute_url }}">
{{ noticia.titulo|upper }}
</a>
</h2>
<p>{{ noticia.descricao|truncatewords:"100" }}</p>
{% endfor %}
{% endblock %}
Ferramentas AuxiliaresFerramentas Auxiliares
• Propicia o desenvolvimento rápido• Reutilização de código
Frameworks PythonFrameworks Python
• Plone/Zope• Pylons• TurboGears• Django
PylonsPylons
• "Full Stack", extremamente flexivel• Reúsa vários componenetes já existentes• A substituiçã ode componentes é muito fácil
Turbo GearsTurbo Gears
• Full stack, mas também com reúso de componentes
• Turbo Gears roda em cima do Pylons
DjangoDjango
• O mais popular no mundo Python• Não reusa nada• Prioriza a integração interna de componentes• Quebra o projeto em aplicações• Facilita muito o reúso, já que há várias apps
disponibilizadas
• Eu uso ele! =)
Zope/PloneZope/Plone
Servido se aplicações Content Management Framework
Google App EngineGoogle App Engine
• Aplicações na Infraestrutura do Google• Autenticação pelo Google Accounts• Big Table• Vários Frameworks
Onde procurar ajuda?Onde procurar ajuda?
• Programadores python tem uma certa aversão a fóruns =P
• Documentações• Listas de Discussão• IRC
Dúvidas?Dúvidas?
Obrigado!Obrigado!
• E-mail: [email protected]• Meu Blog: http://mdpetry.net• Twitter: @petry