Python mudando o modo de desenvolver para a internet

Preview:

DESCRIPTION

Palestra ministrada no evento TcheLinux 2010 em Caxias do Sul - RS

Citation preview

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="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: marcospetry@gmail.com• Meu Blog: http://mdpetry.net• Twitter: @petry