Python mudando o modo de desenvolver para a web - Marcos Daniel Petry

tchelinux 607 views 39 slides Jun 22, 2010
Slide 1
Slide 1 of 39
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39

About This Presentation

Python: mudando o modo de desenvolver para a internet (Marcos Daniel Petry)

A Palestra se propõem a apresentar várias soluções que a linguagem oferece para o desenvolvimento de aplicações voltadas para a internet e uma pequena comparação com alguns de seus “concorrentes” de outras l...


Slide Content

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
JoomlaDrupalZendCake ZopePloneDjango
0
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="pr­index"),
     url(r'^noticia/(?P<secao>)/(?P<categoria>)/$', 'secao',  name="not­secao"),
     url(r'^noticia/(?P<nome>[\­\d\w]+).html$', 'artigo', name='not­detalhe'),
 )

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