Você está na página 1de 205

Desenvolvimento Web com

Python & Django


Copyright 2010, Triveos Tecnologia Ltda. Todos os direitos reservados.
vedada a reproduo integral ou parcial sem a prvia autorizaco do autor.
Parte integrante do curso Desenvolvimento Web com Python e Django.
Apresentao

Osvaldo Santana Neto

Programador amador
desde 1988

Programador
prossional desde
1991

Programador Python
desde 2000

Programador Django
desde 2008
Introduo e Histria
Python

Surgiu em 1989

Criada por Guido van Rossum

Monty Python and the ying circus

Licena compatvel com Software Livre

Linguagem de altssimo nvel (VHLL)

Tipagem dinmica

Multiparadigma (OO, funcional e


procedural)

Compilada + Interpretada
Verses de Python

Python 2.7

Mantido at que a verso 3 esteja estvel


e com boa parte das bibliotecas portadas

Python 3.2

Evoluo da linguagem

Quebra compatibilidade retroativa

Usaremos Python 2.7

O Django (e muitas outras bibliotecas)


ainda no foi portado para o Python 3.0
Verses de Python

Python 2.7

Mantido at que a verso 3 esteja estvel


e com boa parte das bibliotecas portadas

Python 3.2

Evoluo da linguagem

Quebra compatibilidade retroativa

Usaremos Python 2.7

O Django (e muitas outras bibliotecas)


ainda no foi portado para o Python 3.0
Trataremos as
diferenas sempre
que necessrio!
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# prog1.py - Primeiro programa
"""
Importa o mdulo random e sorteia
um nmero inteiro entre 1 e 100
"""
import random
numero = random.randint(1, 100)
escolha, tentativas = 0, 0
while escolha != numero:
escolha = input("Escolha um nmero entre 1 e 100:")
tentativas += 1
if escolha < numero:
print u"O nmero", escolha, u" menor que o sorteado."
elif escolha > numero:
print u"O nmero", escolha, u" maior que o sorteado."
print u"Parabns! Voc acertou com", tentativas, "tentativas."
Primeiro Programa
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# prog1.py - Primeiro programa
"""
Importa o mdulo random e sorteia
um nmero inteiro entre 1 e 100
"""
import random
numero = random.randint(1, 100)
escolha, tentativas = 0, 0
while escolha != numero:
escolha = input("Escolha um nmero entre 1 e 100:")
tentativas += 1
if escolha < numero:
print u"O nmero", escolha, u" menor que o sorteado."
elif escolha > numero:
print u"O nmero", escolha, u" maior que o sorteado."
print u"Parabns! Voc acertou com", tentativas, "tentativas."
Primeiro Programa
Que interpretador
ser usado?
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# prog1.py - Primeiro programa
"""
Importa o mdulo random e sorteia
um nmero inteiro entre 1 e 100
"""
import random
numero = random.randint(1, 100)
escolha, tentativas = 0, 0
while escolha != numero:
escolha = input("Escolha um nmero entre 1 e 100:")
tentativas += 1
if escolha < numero:
print u"O nmero", escolha, u" menor que o sorteado."
elif escolha > numero:
print u"O nmero", escolha, u" maior que o sorteado."
print u"Parabns! Voc acertou com", tentativas, "tentativas."
Primeiro Programa
Qual conjunto de
caracteres (charset)
ser usado no
arqui vo?
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# prog1.py - Primeiro programa
"""
Importa o mdulo random e sorteia
um nmero inteiro entre 1 e 100
"""
import random
numero = random.randint(1, 100)
escolha, tentativas = 0, 0
while escolha != numero:
escolha = input("Escolha um nmero entre 1 e 100:")
tentativas += 1
if escolha < numero:
print u"O nmero", escolha, u" menor que o sorteado."
elif escolha > numero:
print u"O nmero", escolha, u" maior que o sorteado."
print u"Parabns! Voc acertou com", tentativas, "tentativas."
Primeiro Programa
Usa-se # para
comentrios em Python.
Tambm pode-se usar
docstrings.
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# prog1.py - Primeiro programa
"""
Importa o mdulo random e sorteia
um nmero inteiro entre 1 e 100
"""
import random
numero = random.randint(1, 100)
escolha, tentativas = 0, 0
while escolha != numero:
escolha = input("Escolha um nmero entre 1 e 100:")
tentativas += 1
if escolha < numero:
print u"O nmero", escolha, u" menor que o sorteado."
elif escolha > numero:
print u"O nmero", escolha, u" maior que o sorteado."
print u"Parabns! Voc acertou com", tentativas, "tentativas."
Primeiro Programa
Python usa espaos
para delimi tar os
blocos de cdigo
Demonstrao
Criando e executando nosso primeiro programa...
O interpretador
O interpretador
O intepretador
Parmetros Parmetros
Parmetro Descrio
-h
Exibe uma relao de todos os parmetros e uma breve descrio
de funcionalidades.
-O / -OO
Liga a opo de otimizao do cdigo bytecode compilado. O arquivo
gerado passa a ter a extenso .pyo no lugar de .pyc.
-c cmds
Executa os comandos cmds Python passados por parmetro.
-u
Desliga o buffer de sada para o terminal. Isso faz com que todo o
contedo impresso no terminal seja exibido imediatamente.
-m
Executa o mdulo como um programa
O intepretador
Variveis de ambiente Variveis de ambiente
Varivel Descrio
PYTHONHOME
Dene o diretrio inicial onde foi instalado o
Python. Python utilizar essa varivel para montar o
caminho de diretrios que ele ir percorrer para
encontrar a sua biblioteca padro. O caminho de
busca dessas bibliotecas, por padro, ser
PYTHONHOME/lib/python<verso>.
PYTHONPATH
Dene a ordem de procura de diretrios usados
para importar os mdulos Python. Os diretrios
devem ser separados por ":". Diretrios incorretos
ou que no existam sero ignorados.
PYTHONSTARTUP
Nome de um arquivo com cdigo Python que ser
executado pelo interpretador antes de exibir o
prompt do ambiente interativo. Neste arquivo voc
pode denir algumas conguraes para o
interpretador.
A linguagem
Caractersticas

Um comando por linha

Usar ; para mais de uma linha

Usar \ para continuar em outra linha

Bloco de comando por indentao

No misture Tabs e espaos

Comentrios

Caracter # ou """strings multilinhas"""

Diferencia maisculas de minsculas


>>> 2 ** 32, 2 + 5j
(4294967296L, (2+5j)
>>> 5.35 / 2.45
2.1836734693877546
>>> 5 + 2, 5 - 2, 5 * 2, 5 / 2
(7, 3, 10, 2)
>>> 5 / 2.0, 5 // 2.0
(2.5, 2.0)
>>> 5 ** 2, 5 % 2
(25, 1)
>>> 1 & 0, 1 & 1, 1 | 0, 1 | 1
(0, 1, 1, 1)
>>> 1 ^ 0, 1 ^ 1
(1, 0)
>>> ~1, ~0, 1 << 2, 32 >> 2
(-2, -1, 4, 8)
Nmeros

Nmeros inteiros (int),


inteiros longos (long),
ponto utuante (oat) e
complexos (complex)

Operadores

Aritmticos: +, -,
*, /, //, **, %

Bit a bit: &, |, ^, ~, >>,


<<
>>> 2 ** 32, 2 + 5j
(4294967296L, (2+5j)
>>> 5.35 / 2.45
2.1836734693877546
>>> 5 + 2, 5 - 2, 5 * 2, 5 / 2
(7, 3, 10, 2)
>>> 5 / 2.0, 5 // 2.0
(2.5, 2.0)
>>> 5 ** 2, 5 % 2
(25, 1)
>>> 1 & 0, 1 & 1, 1 | 0, 1 | 1
(0, 1, 1, 1)
>>> 1 ^ 0, 1 ^ 1
(1, 0)
>>> ~1, ~0, 1 << 2, 32 >> 2
(-2, -1, 4, 8)
Nmeros

Nmeros inteiros (int),


inteiros longos (long),
ponto utuante (oat) e
complexos (complex)

Operadores

Aritmticos: +, -,
*, /, //, **, %

Bit a bit: &, |, ^, ~, >>,


<<

Diviso:

/ ponto utuante

// inteiro
3
>>> bool( 3 > 2 ), bool( 2 > 3)
(True, False)
>>> bool( 3 <= 2 ), bool( 2 < 3)
(False, True)
>>> bool( 3 == 2 ), bool( 2 == 3)
(False, False)
>>> bool( 0 ), not bool( None )
(False, True)
>>> bool( ["a"] ), not bool( "abc" )
(True, False)
>>> bool( ('a','b') ) and \
not bool( "abc" )
False
>>> bool( ('a','b') ) or \
not bool( "abc" )
True
Lgica

bool()

True, False

0, 0.0, [], (), {}, "", set(),


None, ... - Falso

==, !=, >, >=, <, <=, is, is


not, and, or, in e not in

Usar "is None" para


comparaes com None

Prera "if valor: ..." no


lugar de "valor == True"
ou "valor != 0".
Palavras reservadas
and as assert break class
continue def del elif else
except exec False nally for
global if import in is
lambda None nonlocal not or
pass print raise return True
try while with yield
3
.0
Identicadores

Diferena entre maiscula e minsculas

Nome deve iniciar com letra ou "_"

Restante do nome pode conter letras,


nmeros e "_"

No permitido o uso de palavras


reservadas mas quando necessrio
costuma-se usar um "_" no m do nome
(ex. "from_")
>>> a = "a"
>>> b = "b"
>>> c, d = "cd"
>>> e, f = "e", "f"
>>> print a, b, c, d, e, f
a b c d e f
>>> e, f = f, e
>>> print a, b, c, d, e, f
a b c d f e
>>> a += b
>>> print a
ab
>>> a *= 5
>>> print a
ababababab
Atribuio

Atribuio simples (=)

Atribuio "aumentada":
+=, -=, *=, /=, //=, **=,
%=, |=, &=, ^=, <<= e
>>=

Funcionam como nos


operadores j
explicados

Atribuio por tupla:

a, b = b, a

(a, b) = (b, a)
Referncias

p1 = PessoaFisica()
p1
CONTADOR DE
REFERNCIAS
Referncias

p1 = PessoaFisica()

p2 = p1
p1 p2
CONTADOR DE
REFERNCIAS
Referncias

p1 = PessoaFisica()

p2 = p1

del p1
p2
CONTADOR DE
REFERNCIAS
Referncias

p1 = PessoaFisica()

p2 = p1

del p1

del p2
CONTADOR DE
REFERNCIAS
Referncias

p1 = PessoaFisica()

p2 = p1

del p1

del p2

Destruio do objeto
CONTADOR DE
REFERNCIAS
Comandos
a = input("A:")
b = input("B:")
if a > b:
print "A maior que B"
elif b > a:
print "B maior que A"
else:
print "A e B so iguais"
print ("A maior" if a > b \
else "A no maior")
Comando if/elif/else

Comando de deciso.

Executa o bloco de
cdigo em if ou elif caso
a condio for
verdadeira.

Se nenhuma condio
for verdadeira executa o
bloco else

Expresso if usada entre


parnteses
import sys, time
d = raw_input("Despertar (HH:MM): ")
while time.strftime("%H:%M") != d:
try:
print "\b\b\b\b\btick",
sys.stdout.flush()
time.sleep(0.5)
print "\b\b\b\b\btack",
sys.stdout.flush()
time.sleep(0.5)
except KeyboardInterrupt:
break
else:
print "\n\nTRIM!\a\a\a"
sys.exit(0)
print "\n\nInterrompido!"
Comando while

Executa o bloco de
cdigo, em loop,
enquanto a condio for
verdadeira

A clusula 'else' pode ser


usada e ser executada
caso o loop termine
normalmente (sem
break)
import sys
for linha in sys.stdin:
if not linha.strip(): continue
if "FIM" in linha: break
print "#", linha.rstrip()
else:
print "# FIM DO ARQUIVO"
>>> a = range(10)
>>> print a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for i in a:
... print i,
...
0 1 2 3 4 5 6 7 8 9
Comando for

Itera sobre os elementos


de um objeto (iterador,
seqncia, ...)

Pode ser usado na


forma: 'for key, valor in
dic.items(): ...' onde ele
faz atribuio por tupla
import sys
for linha in sys.stdin:
if not linha.strip(): continue
if "FIM" in linha: break
print "#", linha.rstrip()
else:
print "# FIM DO ARQUIVO"
>>> a = range(10)
>>> print a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for i in a:
... print i,
...
0 1 2 3 4 5 6 7 8 9
Comando continue

Fora a iterao de um
loop (e a vericao de
uma condio no caso
do loop while)
import sys
for linha in sys.stdin:
if not linha.strip(): continue
if "FIM" in linha: break
print "#", linha.rstrip()
else:
print "# FIM DO ARQUIVO"
>>> a = range(10)
>>> print a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for i in a:
... print i,
...
0 1 2 3 4 5 6 7 8 9
Comando break

Interrompe o loop

Um loop interrompido
com break no executa
os comandos da clusula
'else'
import sys
s1, s2 = "String1", "String2"
obj = object()
f = open("/tmp/out.txt", "w")
print s1 # String1\n
print s1, s2 # String1 String2
print s1, # String1!
print s2 # String2
print obj # <object .. 0xXX>
print >>f, s1, s2 # >out.txt
print >>sys.stderr, "ERRO!"
f.close()
$ cat /tmp/out.txt
String1 String2
Comando print

Imprime informaes na
tela

Tambm pode enviar


informaes para um
arquivo
class Abstrata:
def metodo_abstrato(self):
pass
try:
print 1 / 0
except ZeroDivisionError:
pass # ignora exceo
Comando pass

No executa nada

Necessrio para denir


blocos de cdigo vazios
j que Python no utiliza
braces para delimitar
blocos.
>>> a = [1,2,3]
>>> b = a
>>> a.append(4)
>>> a, b
([1, 2, 3, 4], [1, 2, 3, 4])
>>> del b
>>> b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined
>>> a
[1, 2, 3, 4]
>>> del a
>>> a, b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
Comando del

Remove a referncia a
um objeto

Remove elementos de
collections

Quando as referncias
chegam a zero o objeto
entra na la do garbage
collector que ir liberar
os recursos desse objeto
>>> exec "a = 1"
>>> a
1
>>> exec "if a: print 'verdadeiro'"
verdadeiro
Comando exec

Executa o cdigo objeto


(compilado com a
funo builtin compile())
ou a string com cdigo
passada como
parmetro.

Cuidado no uso desse


comando com dados
fornecidos pelo usurio
print "1 == 1?",
assert 1 == 1
print "sim."
try:
print "2 == 1?",
assert 2 == 1, "2 != 1"
except AssertionError, ex:
print str(ex)
$ python prog_assert.py
1 == 1? sim.
2 == 1? 2 != 1
$ python -O prog_assert.py
1 == 1? sim.
2 == 1?
Comando assert

Verica se uma condio


verdadeira. Caso
contrrio levanta uma
AssertionError

Removido nos
mdulos .pyo
(executados com o
parmetro -O/-OO do
interpretador python)
Tipos de dados
Tipos de dados

Em Python, todos os tipos de dados so


objetos

Quando fazemos algo como: int("0")


estamos, na verdade instanciando um
objeto do tipo int() passando "0" para seu
construtor.
>>> type(50)
<type 'int'>
>>> type(0xFF) # Hexadecimal
<type 'int'>
>>> type(034) # Octal
<type 'int'>
>>> 50, 0xFF, 034
(50, 255, 28)
>>> type(50L)
<type 'long'>
>>> type(0xFFFFFFFFFF) # Hexadecimal
<type 'long'>
>>> 0xFFFFFFFFFF # Hexadecimal
1099511627775L
>>> 2147483647 + 1
2147483648L
Inteiros int / long
>>> type(50)
<type 'int'>
>>> type(0xFF) # Hexadecimal
<type 'int'>
>>> type(034) # Octal
<type 'int'>
>>> 50, 0xFF, 034
(50, 255, 28)
>>> type(50L)
<type 'long'>
>>> type(0xFFFFFFFFFF) # Hexadecimal
<type 'long'>
>>> 0xFFFFFFFFFF # Hexadecimal
1099511627775L
>>> 2147483647 + 1
2147483648L
Inteiros int / long

Inteiros int(x, base)

-2147483648 e
2147483647 (32b)

-NUMERO e
+NUMERO (64b)
>>> type(50)
<type 'int'>
>>> type(0xFF) # Hexadecimal
<type 'int'>
>>> type(034) # Octal
<type 'int'>
>>> 50, 0xFF, 034
(50, 255, 28)
>>> type(50L)
<type 'long'>
>>> type(0xFFFFFFFFFF) # Hexadecimal
<type 'long'>
>>> 0xFFFFFFFFFF # Hexadecimal
1099511627775L
>>> 2147483647 + 1
2147483648L
Inteiros int / long

Inteiros int(x, base)

-2147483648 e
2147483647 (32b)

-NUMERO e
+NUMERO (64b)

Longos long(x, base)

Promoo automtica
de tipo

"L" identicando.
Prera o "L"
maisculo

Memria o limite
>>> type(1.5)
<type 'float'>
>>> type(7e-5)
<type 'float'>
>>> type(1e10)
<type 'float'>
>>> 7e-5
6.9999999999999994e-05
>>> print 7e-5 - 7e-3
-0.00693
>>> 7e-5 - 7e-3
-0.0069300000000000004
Ponto utuante oat

Ponto utuante
oat(x)

0.12, 1.25, 2e-5, ...


>>> type(5j)
<type 'complex'>
>>> type(2+5j)
<type 'complex'>
>>> (2+3j) * 5
(10+15j)
Complexos complex

Complexos complex(i,
j)

2+2j, 5j
>>> type(True)
<type 'bool'>
>>> type(False)
<type 'bool'>
>>> int(True)
1
>>> int(False)
0
Booleanos bool

Booleano bool(x)

True e False

Valores Falsos:

(), [], {}, set([]), None,


0, 0.0 e ""

__nonzero__() ou
__len__() retornam 0
Seqncias

So seqncias:

Strings (imutvel)

Listas (mutvel)

Tuplas (imutvel)

Indexveis

Iterveis

"Fativeis" (slice)

List comprehension
Indexao e Slicing

Indice inicial: 0 (zero)

Indexao:

"abcde"[2] 'c' / ['a', 'b', 'c', 'd'][-1] 'd'

Slicing

seq[incio:m:intervalo]

"abcde"[2:] 'cde' / "abc"[:-1] 'ab'

"abcde"[::2] 'ace' / "abcde"[1:-1:2] 'bd'

"abcde"[:] 'abcde' (cpia 'rasa')


Iterao

for c in "abcde": ... percorre todos os


caracteres

for n in [ 1, 2, 3 ]: ... percorre 1, 2 e 3

for x in "": ... no entra no loop


seq = [ -1, 3, -5, 4, 8, 9 ]
# loop
res = []
for n in seq:
if n > 0: res.append(n * n)
print res
# list comprehension
print [ x*x for x in seq if x > 0 ]
print [ x*x for x in seq ] # todos
# ['nome: fulano', 'idade: 35']
d = { 'nome': 'fulano',
'idade': '35' }
print [ "%s: %s" % (k,v) for \
k,v in d.items() ]
List Comprehension

Simplica loops que


percorrem seqncias
(conforme exemplo que
imprime o quadrado dos
nmeros positivos)
Strings str / unicode

String str(x)

'spam', "spam", """spam""" ou '''spam'''

Unicode unicode(x[, codicacao[, erros]])

u'eggs', u"eggs", u"""eggs""" ou u'''eggs'''

Regex strings r"(\w)"

docstrings

Seqncia de caracteres Comporta-se


como uma seqncia imutvel

Slice, indexao, itervel


Strings str / unicode
Caracteres especiais Caracteres especiais
Caracter Descrio
\<newline>
Newline ser ignorado. Usado para continuar string em
outra linha
\\ Caracter de contra-barra
\' Apstrofo
\" Aspas
\a Bell (aviso sonoro)
\b Backspace (volta cursor)
\e Caracter de escape (Esc)
\0
Caracter nulo. No identica trmino da string como
em C
\t Tab horizontal
\r Retorno de carro (Carriage Return)
\n Avano de linha
\0xx \N{nome} \uxxxx
Especica o caracter, em octal, por nome ou em
hexadecimal.
Strings str / unicode
Cdigos de formatao Cdigos de formatao
%[(chave)][atributos][largura][.preciso]cdigo %[(chave)][atributos][largura][.preciso]cdigo
Cdigo Descrio
%s String (mtodo __str__())
%c Caracter
%d Decimal inteiro (trunca nmeros reais)
%i Inteiro com sinal
%o Inteiro em base octal
%x %X
Inteiro em base hexadecimal (letras em minscula ou
maiscula)
%r String via mtodo __repr__()
%f %e %g
Notao cientca: nunca, sempre, ou de acordo com
expoente
%% Caracter %
Strings str / unicode

Mtodos teis:

"a b c".split(' ') ['a', 'b', 'c']

'\n'.join(['a', 'b', 'c']) "a\nb\nc"

"xyz".strip("xz") "y"

'teste1'.startswith('teste') True

'func_test'.endswith('test') True

'_' in 'func_test' True

'a'.find('b') -1 / 'a'.index('b') Exception

'abracadabra'.count('a') 5

'a'.upper() 'A' / 'A'.lower() 'a'


Para listagem
completa:
dir(str)
>>> "ola", u"ola"
('ola', u'ola')
>>> "Ola mundo"[5] # index
'u'
>>> "Ola mundo"[5:] # slice
'mundo'
>>> "Ola mundo"[2:5]
'a m'
>>> "Ola mundo"[:-1]
'Ola mund'
>>> "Ola mundo"[::2]
'Oamno'
>>> for c in "Spam":
... print c * 2,
...
SS pp aa mm
>>> print "\tx"
x
>>> print r"\tx"
\tx
>>> a = "Ol"
>>> print a
Ol
>>> b = a.decode("latin1")
>>> print b
Ol
>>> print b.encode("latin1")
Ol
>>> f = ru"C:\Diretrio"
>>> print f
C:\Diretrio
Strings str / unicode
>>> print "Ola %s" % ("mundo",)
Ola mundo
>>> print """Spam: %(spam)d;
... Eggs: %(eggs)d""" % (\
... {'spam': 1, 'eggs': 2})
Spam: 1; Eggs: 2
>>> "Dlar: %1.2f" % (2.1,)
'Dlar: 2.10'
>>> "Dlar: %1.2f" % (2.156,)
'Dlar: 2.16'
>>> "Desconto: %03d%%" % (35,)
Desconto: 035%
>>> print "|%d|%5d|%-5d|%05d|" %\
... (3, 3, 3, 3)
|3| 3|3 |00003|
>>> print "%+d e %d" % (3, 3)
+3 e 3
>>> print "%g e %g" % (0.0005,
0.00005)
0.0005 e 5e-05
>>> print "%015.5f" % (5.015,)
000000005.01500
>>> a = "spam"
>>> print "%s" % a
spam
>>> def func(x):
... """func(x) -> inteiro"""
... return int(x)
...
>>> func.__doc__
'func(x) -> inteiro'
Strings str / unicode
>>> "a\nb c\nd".split()
['a', 'b', 'c', 'd']
>>> "a; b; c; ".split("; ")
['a', 'b', 'c', '']
>>> "".split(), "abc".split()
([], ['abc'])
>>> ":".join([ 'a', 'b', 'c' ])
'a:b:c'
>>> "\t abc \t\n".strip()
'abc'
>>> "xyz".strip("xz")
'y'
>>> 'teste'.startswith('test')
True
>>> 'test' in 'um teste'
True
>>> 'abc'.find('z'), 'abc'.find('a')
(-1, 0)
>>> 'abc'.find('c')
2
>>> 'abc'.index('z')
ValueError: substring not found
>>> 'abc'.index('c')
2
>>> 'aba'.count('a')
2
>>> 'accbcc'.count('cc')
2
>>> 'abcde'.upper()
'ABCDE'
>>> 'ABCDE'.lower()
'abcde'
Strings str / unicode
Listas list

Lista list(x)

[ 1, 2, 3 ], list('seq')

Mutvel

lista[2] = 'spam'

lista + ['eggs']
Listas list

Mtodos teis:

['a'].append('b') ['a', 'b'] (inline)

['a'].extend(['b', 'c']) ['a','b','c'] (inline)

['a'].insert(0, 'x') ['x', 'a']

['a', 'b'].pop() 'b' (lista fica ['a'])

['b', 'a'].sort() ['a', 'b'] (inline)

['b', 'a'].reverse() ['a', 'b'] (inline)

in, .index(), e .count() funcionam como em


String
Para listagem
completa:
dir(list)
>>> ['a', 'b']
['a', 'b']
>>> ['a', 'b'] + ['c', 'd']
['a', 'b', 'c', 'd']
>>> a = ['a', 'b', 'c', 'd']
>>> a
['a', 'b', 'c', 'd']
>>> a[0] = 'X'
>>> a
['X', 'b', 'c', 'd']
>>> a += "efg"
>>> a
['X', 'b', 'c', 'd', 'e', 'f', 'g']
>>> a + "ghi"
TypeError: can only concatenate list
(not "str") to list
>>> ['a', 'b', 'c', 'd'][0]
'a'
>>> ['a', 'b', 'c', 'd'][0:2]
['a', 'b']
Listas list
>>> a = [1, 2, 3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
>>> a.extend([5, 6])
>>> a
[1, 2, 3, 4, 5, 6]
>>> a.insert(2, 2.5)
>>> a
[1, 2, 2.5, 3, 4, 5, 6]
>>> a.pop()
6
>>> a
[1, 2, 2.5, 3, 4, 5]
>>> a.reverse()
>>> a
[5, 4, 3, 2.5, 2, 1]
>>> a.sort()
>>> a
[1, 2, 2.5, 3, 4, 5]
>>> ['err', 'ok', 'err'].count('err')
2
Listas list
Tuplas tuple

Tupla tuple(x)

( 1, 2, 3 ), tuple([1,2,3])

Imutvel

tupla[2] = 'spam' # Erro!

tupla + ['eggs'] # Erro!

Consome menos recursos que list()


Dicionrios dict

Dicionrio dict(x)

{ 'chave1': 'valor1', 'chave2': 'valor2' }

dict(k1=v1, k2=v2)

Mutvel

dicionario['chave1'] = 'valor novo'

dicionario['chave nova'] = 1

Hashmap (no preserva ordem das chaves)

Python usa dicionrios em toda sua


implementao
Dicionrios dict

Mtodos teis:

{'a':1}.get('b', 0) 0

{'a':1}.setdefault('b', 0) 0 / d['b'] = 0

{'a': 1, 'b': 2}.items() [('a', 1), ('b', 2)]

{'a': 1, 'b': 2}.keys() ['a', 'b']

{'a': 1, 'b': 2}.values() [1, 2]

{'a': 1}.update({'b': 2}) {'a': 1, 'b': 2} (inline)

{'a': 1, 'b': 2}.pop('a') 1 / del d['a']

'chave' in {'chave': 1} True


Para listagem
completa:
dir(dict)
>>> d = { "c1": "v1" }
>>> dic["c2"] = "v2"
>>> d
{'c1': 'v1', 'c2': 'v2'}
>>> d[1] = "chave numerica"
>>> d
{'c1': 'v1', 1: 'chave numerica',
'c2': 'v2'}
>>> tuplachave = (1, 2, 3)
>>> d[tuplachave] = "objeto chave"
>>> d
{'c1': 'v1', 1: 'chave numerica',
'c2': 'v2',
(1, 2, 3): 'objeto chave'}
>>> d.update({'c3':'v3', 'c4':'v4'})
>>> d
{1: 'chave numerica', 'c3': 'v3',
'c2': 'v2', 'c1': 'v1', 'c4': 'v4',
(1, 2, 3): 'objeto chave'}
>>> d.pop('c4')
'v4'
>>> d
{1: 'chave numerica', 'c3': 'v3',
'c2': 'v2', 'c1': 'v1',
(1, 2, 3): 'objeto chave'}
>>> d.items()
[(1, 'chave numerica'), ('c3', 'v3'),
('c2', 'v2'), ('c1', 'v1'),
((1, 2, 3), 'objeto chave')]
>>> d.keys()
[1, 'c3', 'c2', 'c1', (1, 2, 3)]
>>> d.values()
['chave numerica', 'v3', 'v2', 'v1',
'objeto chave']
Dicionrios dict
>>> 'c1' in d, 'c4' in d
(True, False)
>>> d.get('c4', 'v4')
'v4'
>>> 'c4' in d
False
>>> d.setdefault('c4', 'v4')
'v4'
>>> d['c4']
'v4'
>>> d.setdefault('c4', 'X')
'v4'
>>> d['c4']
'v4'
Dicionrios dict
notas = {
"Graham Chapman": 5.5,
"John Cleese": 7.0,
"Terry Gilliam": 4.5,
"Terry Jones": 4.5,
"Eric Idle": 10,
"Michael Palin": 3.5,
}
print "Conteudo dicionario:", \
notas
print
for aluno in notas:
print aluno
print
for nota in notas.values():
print nota
print
for aluno, nota in notas.items():
print "Aluno: %-20s Nota: %4.1f" % \
(aluno, nota)
Dicionrios dict
Conteudo do dicionario: {'Terry
Gilliam': 4.5, 'Eric Idle': 10,
'Graham Chapman': 5.5, 'Michael
Palin': 3.5, 'Terry Jones': 4.5,
'John Cleese': 7.0}
Terry Gilliam
Eric Idle
Graham Chapman
Michael Palin
Terry Jones
John Cleese
4.5
10
5.5
3.5
4.5
7.0
Aluno: Terry Gilliam Nota: 4.5
Aluno: Eric Idle Nota: 10.0
Aluno: Graham Chapman Nota: 5.5
Aluno: Michael Palin Nota: 3.5
Aluno: Terry Jones Nota: 4.5
Aluno: John Cleese Nota: 7.0
Dicionrios dict
Arquivos le

Arquivo le(x) / open(x)

le(nome, modo, buffer)

le("/etc/passwd")

Buffer (f.ush() para esvaziar):

0 Sem buffer

1 Com buffer

+N Tamanho do buffer

Itervel linha-a-linha (for linha in arquivo: ...)


Arquivos le
Modos Modos Modos Modos
r
Leitura
w
Escrita (trunca)
a
Escrita (adiciona)
b
Binrio
+
Leitura e Escrita
U
Quebra de linha universal
No pode ser usado
com w ou +
Arquivos le

Mtodos teis:

f.close() Fecha o arquivo

f.flush() Esvazia o buffer

f.read(5) 'linha'

f.seek(0) Posiciona no incio do arquivo

f.tell() 0 (incio do arquivo)

f.write('linha final') Escreve 'linha nal'

f.readline() 'linha 1'

f.readlines() ['linha 1', 'linha 2', ...]


Para listagem
completa:
dir(file)
>>> f = file("arq.txt", "a")
>>> f.write("linha 4\n")
>>> f.close()
>>> f = file("arq.txt")
>>> for l in f: print l,
...
linha 1
linha 2
linha 3
linha 4
>>> f.seek(0)
>>> f.read(5)
'linha'
>>> f.tell()
5L
>>> f.readlines()
[' 1\n', 'linha 2\n', 'linha 3\n',
'linha 4\n']
>>> f.seek(0)
>>> f.readline()
'linha 1\n'
>>> f.close()
Arquivos le
Contedo do arqui vo:
linha 1
linha 2
linha 3
>>> f = file("arq.txt", "a")
>>> f.write("linha 4\n")
>>> f.close()
>>> f = file("arq.txt")
>>> for l in f: print l,
...
linha 1
linha 2
linha 3
linha 4
>>> f.seek(0)
>>> f.read(5)
'linha'
>>> f.tell()
5L
>>> f.readlines()
[' 1\n', 'linha 2\n', 'linha 3\n',
'linha 4\n']
>>> f.seek(0)
>>> f.readline()
'linha 1\n'
>>> f.close()
Arquivos le
Iteradores iter

Iterador iter(x)

iter([1,2,3])

Generators tambm implementam a


interface de iteradores

Generator expressions so iguais uma list


comprehension mas retorna um iterador no
lugar de uma lista

Equivalente a list((x for x in seq))


>>> a = [1, 2, 3]
>>> i = iter(a)
>>> type(i)
<type 'listiterator'>
>>> i.next(), i.next(), i.next()
(1, 2, 3)
>>> i.next()
Traceback (most recent call last):
StopIteration
>>> def f(n):
... for i in range(n):
... yield i
...
>>> r = f(3)
>>> type(r)
<type 'generator'>
>>> r.next(), r.next(), r.next()
(0, 1, 2)
>>> r.next()
Traceback (most recent call last):
StopIteration
>>> g = ( x for x in range(3) )
>>> type(g)
<type 'generator'>
>>> g.next(), g.next(), g.next()
(0, 1, 2)
>>> g.next()
Traceback (most recent call last):
StopIteration
Iteradores iter
Funes builtin

abs(x) Valor absoluto de um nmero

divmod(x, y) Diviso inteira e mdulo

round(x[, d]) oat com x arredondado d casas decimais

all(iter) True se todos os elementos forem verdadeiros

any(iter) True se um dos elementos for verdadeiro

callable(obj) True se o objeto for 'chamvel'. Ex. obj()

chr(ascii) caracter com cdigo ASCII informado

unichr(cdigo) caracter unicode com cdigo informado

ord(caracter) retorna o cdigo ASCII/Unicode do caracter

oct(i) retorna o nmero i no formato octal

dir([obj]) mostra todos os identicadores membros de obj

execfile(...) executa o arquivo informado

hash(obj) retorna o hash do objeto


Funes builtin

id(obj) retorna o identicador do objeto

len(obj) retorna o tamanho do objeto

raw_input(p) solicita a entrada do usurio

input(p) solicita entrada do usurio e avalia com eval()

globals() dicionrio com identicadores globais

locals() dicionrio com identicadores locais

vars([obj]) identicadores do objeto

max(s|x1, x2, ...) maior valor da seqncia

min(s|x1, x2, ...) menor valor da seqncia

range(s, e, i) retorna uma seqncia de s at e intervalo i

xrange(...) mesmo que range() mas retorna um iterador

enumerate(iter) retorna tuplas (indice, elemento)

open(...) atalho para le()


Funes

Existem 2 tipos de funes:

Funes "convencionais" (def)

Funes annimas (lambdas)

Todo objeto que implementa o mtodo


__call__() executvel.
Chamando uma funo
ret = funcao(
param1,
param2,
param3=valor3,
param4=valor4,
*seq_parametros,
**dic_parametros,
)
Denindo uma funo

Funo:
def funcao(param1, param2, param3="default",
*params, **dicparams): ...

Funo annima:
lambda p1, p2, p3=1, *ps, **dps: ...

Sempre nessa ordem: parmetros normais,


opcionais (default), sequencia e dicionrio.
Parmetros

param nome da varivel local que receber


o valor

param=valor mesmo que param mas


assume valor default caso no informado

*params lista dos parmetros adicionais

**dparams dicionrio com parmetros


adicionais passados na forma param=valor
>>> def spam(x, y):
... return x ** y
...
>>> spam(5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: spam() takes exactly 2 arguments (1 given)
>>> def spam(x, y=2):
... return x ** y
...
>>> spam(5)
25
>>> spam(5, 3)
125
Demonstrao
>>> def spam(x, y=2, *args, **kw):
... print x, y, args, kw
...
>>> spam(1)
1 2 () {}
>>> spam(1, 3)
1 3 () {}
>>> spam(1, 2, 3, 4, a1=5, a2=6)
1 2 (3, 4) {'a1': 5, 'a2': 6}
>>> def spam(x, *a, **k, y):
File "<stdin>", line 1
def spam(x, *a, **k, y):
^
SyntaxError: invalid syntax
Demonstrao
>>> def spam(x, y=2, z):
... pass
...
File "<stdin>", line 1
SyntaxError: non-default argument follows default argument
>>> def spam(x, y=2, *a, **kw):
... print x, y, a, kw
...
>>> spam(1, z=3)
1 2 () {'z': 3}
>>> spam(1, z=3, 2)
File "<stdin>", line 1
SyntaxError: no-keyword arg after keyword arg
Demonstrao
def potencia(x, y=2): return x ** y
def sem_return(): pass
d = {'txt': "Arquivo texto",
'html': "Arquivo HTML" }
m = {'txt': "text/plain",
'html': "text/html" }
def arquivo(ext):
return d[ext], m[ext]
potencia(5) # 25
sem_return() # None
arquivo('txt') # ('Arquivo texto',
# 'text/plain')
Comando return

Retorna o valor de uma


funo

Pode retornar mais de


um valor ao mesmo
tempo (tupla)
Generators
db = (((2009, 01, 05), "rec1"),
:
((2009, 06, 05), "rec6"))
def busca(dt_ini, dt_fim):
for rec in db:
if rec[0] >= dt_ini and \
rec[0] <= dt_fim:
msg = yield rec[1]
if msg:
print rec[1], msg
b = busca((2009, 03, 01),
(2009, 05, 01))
print b.next()
b.send("OK")
Comando yield

Espcie de iterador que


permite o retorno
funo geradora para
que ela produza o novo
elemento da iterao

Pode-se enviar
mensagens para a funo
geradora via
mtodo .send()

Pode-se gerar uma


exceo na funo com
o mtodo .throw()
Escopo

Busca-se os identicadores no escopo


local, escopo das funes externas, escopo
global, e ento no escopo __bultins__.

Atribuies, por padro, criam/alteram


identicadores do escopo local.

O comando global faz com que os


identicadores sejam criados/alterados no
escopo global.
def l():
x = "L"
print "l:", x # l(): L
def g():
global x
x = "G"
print "g():", x # g(): G
x = "X"
print "X1:", x # X1: X
l() # l(): L
print "X2:", x # X2: X
g() # g(): G
print "X3:", x # X3: G
Comando global

Diz que um identicador


foi declarado no escopo
global (e no no local)
def fib(n):
if n < 2: return 1
return fib(n-1) + fib(n-2)
def memoize(fn):
memo = {}
def memoizer(key):
if key not in memo:
memo[key] = fn(key)
return memo[key]
return memoizer
print fib(35) # muuuito mais lento
fib = memoize(fib)
print fib(35)
Closures

Funes que constroem


funes

Linguagem deve ter


funes como objetos
de primeira classe

Linguagem deve permitir


acessar identicadores
de funes externas
def memoize(fn):
memo = {}
def memoizer(key):
if not key in memo:
memo[key] = fn(key)
return memo[key]
return memoizer
@memoize
def fib(n):
if n < 2: return 1
return fib(n-1) + fib(n-2)
print fib(35)
Decorators

Sintaxe nova para


substituir as atribuies:
x = dec(x)
Com decorator Sem decorator
@dec1
def f(x):
return x * 2
def f(x):
return x * 2
f = dec1(f)
@dec1
@dec2
def f(x):
return x * 2
def f(x):
return x * 2
f = dec1(dec2(f))
@dec1(arg)
def f(x):
return x * 2
def f(x):
return x * 2
f = dec1(arg)(f)
Excees
Excees

Comandos:

try:/except:/else:/nally: tratamento de
excees.

raise

Excees builtin (mais comuns):


Exception, AttributeError, IOError, ImportError,
IndexError, KeyError, KeyboardInterrupt,
NotImplementedError, UnicodeError e ValueError.
Excees
class NotFound(Exception): pass
class InvalidKey(Exception): pass
def find(collection, elem):
try:
return collection[elem]
except (KeyError, IndexError), ex:
raise NotFound("%s not found (%s)" % \
(elem, ex))
except TypeError:
raise InvalidKey("%s is invalid" % \
(elem,))
a, b = [0], {}
try:
find(a, 1) # IndexError
except Exception, ex:
print "Exception: %s" % (ex,)
try:
find(b, 'spam') # KeyError
except Exception, ex:
print "Exception: %s" % (ex,)
try:
find(a, "spam") # TypeError
except Exception, ex:
print "Exception: %s" % (ex,)
try:
find(b, 0) # No error
except Exception, ex:
print "Exception: %s" % (ex,)
else:
print "Element found."
try:
find(a, "spam") # TypeError again
except Exception, ex:
raise # re-raise exception
Excees
def readfile(filename, bytes):
try:
f = file(filename)
except IOError:
return ""
try:
return f.read(bytes)
except IOError:
return ""
finally:
f.close()

print "Nao existe:", readfile("no.txt", 5)
print "Existe:", readfile("yes.txt", 5)
Excees
Programao
Orientada a Objetos
Objetos
Instncias Classe
Classes

Denida com o comando class

Suporte a herana mltipla

Mtodo inicializador ("construtor"):


def __init__(self, ...): ...

Instanciar: identicador = Pessoa()


Classes
Classe Instncia
Atributos
Mtodos
Mtodo
esttico
class Pessoa(object):
atributo = 1
class Pessoa(object):
def __init__(self, attr):
self.attr = attr
class Pessoa(object):
@classmethod
def metodo(cls, arg):
pass
class Pessoa(object):
def metodo(self, arg):
pass
class Pessoa(object):
@staticmethod
def metodo(arg):
pass
class Pessoa(object):
def __init__(self, nome):
self.nome = nome
def valida(self):
raise NotImplementedError()
class PF(Pessoa):
tabela_db = "pessoa_fisica"
def __init__(self, nome, cpf):
super(PF, \
self).__init__(nome)
self.cpf = ''.join(\
d for d in cpf if d.isdigit()
)
def valida(self):
return len(self.cpf) == 11
class PJ(Pessoa):
tabela_db = "pessoa_juridica"
def __init__(self, nome, cnpj):
super(PJ, \
self).__init__(nome)
self.cnpj = ''.join(\
d for d in cnpj if d.isdigit()
)
def valida(self):
return len(self.cnpj) == 14
f = PF("Fulano", "123.456.789-01")
j = PJ("ACME", "12345678/0001-90")
print f.nome, f.cpf, f.valida()
print j.nome, j.cnpj, j.valida()
Objetos
Segurana

Todos os mtodos e atributos so pblicos

Por conveno os mtodos com nomes


iniciados por "_" so privados

Adicionar "__" (duplo) renomeia o


identicador para "_Classe__metodo"
Propriedades

No necessrio getters e setters

Acesse os atributos diretamente

Para validar as entradas ou calcular as


sadas transforme-o em uma propriedade

Use a funo property()


class Forno(object):
def __init__(self):
self.temp = 0
forno = Forno()
print forno.temp # 0
forno.temp = 120
print forno.temp # 120
forno.temp = 300 # FORNO DERRETIDO!
Propriedades
class Forno(object):
def __init__(self):
self._temp = 0
def _get_temp(self):
return self._temp
def _set_temp(self, temp):
if temp > 250:
raise ValueError(\
"Maxima: 250")
self._temp = temp
temp = property(_get_temp,
_set_temp)
forno = Forno()
print forno.temp # 0
forno.temp = 120
print forno.temp # 120
forno.temp = 300 # ValueError
Propriedades
Mdulos, pacotes e
bibliotecas
Pacotes e Mdulos

Importar um mdulo ou pacote:

import pacote.modulo [as nome]

Importa para o namespace do mdulo

from pacote.modulo import ident|*

Importa para o namespace corrente

Mdulo "executado" ao ser importado

Se necessrio mdulo recompilado para


bytecode (.pyc/.pyo)
Pacotes e Mdulos

Pacotes: diretrios com arquivo __init__.py

Mdulo:

.py mdulo fonte

.pyc / .pyo bytecode (com e sem asserts)

.pyd / .so extenso em C para


Windows e Unix/Linux

Mdulos e pacotes so procurados no


PYTHONPATH:

import sys; print sys.path


Pacotes e Mdulos

Atributos do mdulo:

__name__ nome do mdulo ou


__main__ se for executado diretamente

__le__ caminho completo para o


arquivo importado

Para proteger cdigo da execuo durante


o import:

if __name__ == "__main__": ...


Biblioteca padro
anydbm bz2 calendar cgi CGIHTTPServer cgitb
cmd codecs collections ConfigParser copy csv
ctypes datetime decimal distutils doctest DocXMLRPCServer
email ftplib gc getpass glob gzip
hashlib htmlentitydefs HTMLParser httplib imaplib locale/gettext
logging mailbox math mmap optparse os
os.path pickle/cPickle platform poplib pprint Queue
random re shelve shlex shutil signal
SimpleHTTPServer SimpleXMLRPCServer smtpd smtplib socket SocketServer
sqlite3 ssl stat string StringIO/cStringIO struct
subprocess sys tarfile tempfile thread threading
time traceback unittest urllib urllib2 urlparse
uuid weakref webbrowser wsgiref xml.dom.minidom xml.etree
xml.sax xmlrpclib zipfile zlib
PIP

Utilitrio de instalao de bibliotecas

Baixa e instala pacotes do PyPI (Python


Package Index)

Comando: pip install nome_do_pacote

Necessrio permisso de administrador

No vem instalado por padro, necessrio


baixar em:

http://pypi.python.org/pypi/pip
Virtualenv

Cria ambientes Python isolados

Permite modicao de um ambiente sem


causar interferncia em outros

Instalar virtualenv

sudo pip install virtualenv

Criar um ambiente virtual

virtualenv nome_do_ambiente

Ativando um ambiente

source nome_do_ambiente/bin/activate
Django
Django

Criado por Jacob Kaplan-Moss, Adrian


Holovaty e Simon Willison em 2003

Criado como um CMS para a World Online


(diviso Web do Lawrence Journal-World
em Lawrence, Kansas)

Tornado opensource logo aps

Framework Web gil

DRY - Don't Repeat Yourself


Componentes

Object-relation Mapper mapeador objeto-


relacional

Template System linguagem de templates

URL dispatcher processador de URLs

Admin Interface Interface de administrao

Internacionalizao regionalizao

Outros: gerador de formulrio, serializador


de dados, autenticao e segurana, ...
MVC vs. MTV

Pattern MVC

Model lgica de negcios

View camada(s) de visualizao

Controller manipulao de Model

Pattern MTV

Model mesmo que no MVC

Template mesmo que a View do MVC

View mesmo que a Controller do MVC

A essncia continua a mesma


Instalao

Criar ambiente com virtualenv e ativ-lo

Instalando "na mo":

Baixar do site:

http://djangoproject.com/download/

Descompactar

No diretrio do Django rodar:

python setup.py install

Ou usando o setuptools com o comando:

pip install django


$ su -
# apt-get install python-pip
# pip install virtualenv
# exit
$ virtualenv aula --no-site-packages
$ cd aula
aula $ source bin/activate
(aula) aula$ pip install django
Instalao
O Projeto de aula

Agenda de eventos

Cadastro de evento com data/hora e


lugar

Cadastro dos usurios que participaro


do evento

Sistema de autenticao de usurio


Iniciando o projeto

Utilitrio django-admin.py

Diversos comandos de gerenciamento

django-admin.py help para list-los

django-admin.py help <comando> para


ajuda detalhada de cada comando

Criando um projeto 'gerenciador':

django-admin.py startproject gerenciador


$ cd aula
aula$ source bin/activate
(aula) aula$ django-admin.py startproject gerenciador
(aula) aula$ cd gerenciador
(aula) aula/gerenciador$ ls
__init__.py manage.py settings.py urls.py
(aula) aula/gerenciador$ chmod +x manage.py
(aula) aula/gerenciador$ ls
__init__.py manage.py* settings.py urls.py
Iniciando o projeto
Os arquivos do projeto

__init__.py arquivo vazio

manage.py utilitrio parecido com o


django-admin.py. Colocado aqui por
comodidade.

Dica: chmod +x manage.py

settings.py arquivo de congurao do


projeto

urls.py denies de URLs do projeto


Testando

Django vem com um servidor Web prprio


para ser usado durante o desenvolvimento

Recarga automtica de mdulos

NO usar este servidor em produo

O comando para iniciar o servidor :

./manage.py runserver

Aponte o navegador para o endereo:

http://localhost:8000/
Testando
Gerenciando
manage.py manage.py
Comando Descrio
syncdb Cria tabelas no banco de dados
dumpdata --format F [aplicao] Descarrega dados da aplicao em XML ou JSON
loaddata fixture Carrega dados no banco de dados
shell Interpretador Python com modelos de dados
createsuperuser --username --email Cria um usurio administrador
runserver [endereo:porta] Inicia o servidor Web de desenvolvimento
startapp [aplicao] Cria uma nova aplicao no projeto
Aplicaes

Aplicaes Django so mdulos com


funcionalidades que podem ser
reaproveitadas em vrios projetos

Exemplos:

Sistema de comentrios

blog

tags

autenticaes alternativas

etc.
Aplicaes
Aplicaes
(aula) aula/gerenciador$ ./manage.py startapp agenda
(aula) aula/gerenciador$ ls
__init__.py agenda manage.py* settings.py urls.py
(aula) aula/gerenciador$ ls agenda
__init__.py models.py tests.py views.py
Aplicaes
from django.conf.urls.defaults import *
# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()
urlpatterns = patterns('',
# Example:
# (r'^gerenciador/', include('gerenciador.foo.urls')),
(r'^$', 'agenda.views.index'),
# Uncomment the admin/doc line below and add 'django.contrib.admindocs'
# to INSTALLED_APPS to enable admin documentation:
# (r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
# (r'^admin/', include(admin.site.urls)),
)
Dizendo "Ol"
Arqui vo:
urls.py
# -*- encoding: utf-8 -*-
from django.http import HttpResponse
def index(request):
return HttpResponse(u"Ol mundo!")
Dizendo "Ol"
Arqui vo:
agenda/
views.py
(aula) aula/gerenciador $ ./manage.py runserver
Validating models...
0 errors found
Django, using settings 'gerenciador.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Dizendo "Ol"
Dizendo "Ol"
from django.db import models
class ItemAgenda(models.Model):
data = models.DateField()
hora = models.TimeField()
titulo = models.CharField(max_length=100)
descricao = models.TextField()
Models
Arqui vo:
agenda/
models.py
ItemAgenda
data: Date
hora: Time
titulo: Varchar(100)
descricao: Text
Models
Tipos de campos Tipos de campos Tipos de campos Tipos de campos Tipos de campos
BooleanField EmailField IntegerField SmallIntegerField URLField
CharField FileField IPAddressField PositiveSmallIntegerField XMLField
DateField FilePathField TextField CommaSeparatedIntegerField TimeField
DateTimeField FloatField SlugField NullBooleanField
AutoField DecimalField ImageField PositiveIntegerField
Opes dos campos Opes dos campos Opes dos campos Opes dos campos
null db_index help_text unique_for_month
blank db_tablespace primary_key unique_for_year
choices default unique verbose_name
db_column editable unique_for_date
Congurando

Arquivo de congurao: settings.py

J vem preenchido

Arquivo auto-explicativo

Repleto de comentrios e conguraes


default mais comuns

Informaes sobre todas as opes em:

http://docs.djangoproject.com/en/dev/ref/settings/#ref-settings
Congurando

Congurao da conexo com o Banco de


Dados para o ORM

At o momento suporta os bancos:


SQLite3, MySQL, PostgreSQL ou Oracle.

Usaremos o SQLite3

Recomendado usar outro banco de dados


em ambientes de produo
# Caso 2: SQLite3
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'gerenciador.db',
'USER': '', 'PASSWORD': '',
'HOST': '', 'PORT': '',
}
}
# Caso 1: MySQL
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'gerenciadordb',
'USER': 'user_name', 'PASSWORD': 'secreta123',
'HOST': '', 'PORT': '',
}
}
Congurando
# Caso 2: SQLite3
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'gerenciador.db',
'USER': '', 'PASSWORD': '',
'HOST': '', 'PORT': '',
}
}
# Caso 1: MySQL
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'gerenciadordb',
'USER': 'user_name', 'PASSWORD': 'secreta123',
'HOST': '', 'PORT': '',
}
}
Congurando
Arqui vo:
settings.py
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'agenda',
)
Congurando
Arqui vo:
settings.py
(aula) aula/gerenciador$ ./manage.py syncdb
:
Creating table agenda_itemagenda
You just installed Django's auth system, which means you don't have any
superusers defined.
Would you like to create one now? (yes/no): yes
Username (Leave blank to use 'osantana'): dead_parrot
E-mail address: dead_parrot@montypython.co.uk
Password: XXXXX
Password (again): XXXXX
Superuser created successfully.
:
Installing index for agenda.ItemAgenda model
Gerenciando dados
(aula) aula/gerenciador$ sqlite3 gerenciador.db
SQLite
Enter ".help" for instructions
sqlite> .schema agenda_itemagenda
CREATE TABLE "agenda_itemagenda" (
"id" integer NOT NULL PRIMARY KEY,
"data" date NOT NULL,
"hora" time NOT NULL,
"titulo" varchar(100) NOT NULL,
"descricao" text NOT NULL,
);
Gerenciando dados
Mostrando Dados
(aula) aula/gerenciador$ mkdir -p agenda/templates
Mostrando dados
Linguagem de Template

A linguagem de templates do Django


composta de tags e ltros

As tags (com comandos) devem car entre


as marcaes {% e %}

Para imprimir o resultado de uma


expresso podemos usar os marcadores
{{ e }}
Linguagem de Template

A linguagem propositadamente
construda para desetimular a incluso de
lgica dentro dos templates

O conceito de herana de templates


permite reaproveitar trechos de outros
templates da mesma maneira que a herana
o faz no paradigma da programao OO

possvel criar tags e ltros personalizadas


para extender a linguagem de template
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
{% block cabecalho %}
<title>Agenda</title>
{% endblock %}
</head>
<body>
{% block corpo %}
<!-- body -->
{% endblock %}
</body>
</html>
Mostrando dados
Arqui vo:
templates/
base.html
{% extends 'base.html' %}
{% block corpo %}
<a href="/adiciona/">Adicionar novo item</a>
<ul>
{% for item in lista_itens %}
<li>
<a href="/item/{{ item.id }}">
{{ item.data|date:'d/m/Y' }} - {{ item.titulo }}</a>
</li>
{% empty %}
<li>Sem itens na lista</li>
{% endfor %}
</ul>
{% endblock %}
Mostrando dados
Arqui vo:
templates/
lista.html
View
# -*- encoding: utf-8 -*-
from django.shortcuts import render
from models import ItemAgenda
def index(request):
lista_itens = ItemAgenda.objects.all()
return render(request, "lista.html",
{'lista_itens': lista_itens})
Mostrando dados
Arqui vo:
agenda/
views.py
Mostrando dados
Criando objetos
Formulrios

Uma das formas mais usadas para interao


dos usurios com a aplicao

Django oferece classes geradoras de


formulrios: forms.Form e
forms.ModelForm

A impresso dos campos de um formulrio


podem ser feitas com uma instruo no
template: form.as_p, form.as_li ou
form.as_table
Formulrios

Campos

Fazem o mapeamento do formulrio


recebido via POST j convertendo o
valor recebido para um tipo Python

Widget

O visual que o campo ter na pgina


HTML (ex. campo data ser um campo
texto ou um calendrio para escolha da
data)
Formulrios
Tipos de campos Tipos de campos Tipos de campos Tipos de campos
BooleanField DateTimeField FloatField NullBooleanField
CharField DecimalField ImageField RegexField
ChoiceField EmailField IntegerField TimeField
TypedChoiceField FileField IPAddressField URLField
DateField FilePathField MultipleChoiceField
Tipos de widgets Tipos de widgets Tipos de widgets Tipos de widgets
TextInput DateInput Select MultiWidget
PasswordInput DateTimeInput NullBooleanSelect SplitDateTimeWidget
HiddenInput TimeInput SelectMultiple SelectDateWidget
MultipleHiddenInput Textarea RadioSelect
FileInput CheckboxInput CheckboxSelectMultiple
from django import forms
from agenda.models import ItemAgenda
class FormItemAgenda(forms.ModelForm):
data = forms.DateField(
widget=forms.DateInput(format='%d/%m/%Y'),
input_formats=['%d/%m/%Y', '%d/%m/%y'])
class Meta:
model = ItemAgenda
fields = ('titulo', 'data', 'hora', 'descricao')
ModelForm
Arqui vo:
agenda/
forms.py
{% extends 'base.html' %}
{% block corpo %}
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Adicionar</button>
</form>
{% endblock %}
Formulrios
Arqui vo:
templates/
adiciona.html
from django.conf.urls.defaults import *
# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()
urlpatterns = patterns('',
# Example:
# (r'^gerenciador/', include('gerenciador.foo.urls')),
(r'^$', 'agenda.views.index'),
(r'^adiciona/$', 'agenda.views.adiciona'),
)
Formulrios
Arqui vo:
urls.py
from django.shortcuts import render, redirect
from forms import FormItemAgenda
def adiciona(request):
if request.method == 'POST': # Formulrio enviado
form = FormItemAgenda(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect("/")
else:
# Exibe formulrio em branco
form = FormItemAgenda()
return render(request, "adiciona.html", {'form': form})
ModelForm
Arqui vo:
agenda/
views.py
from django.shortcuts import render, redirect
from forms import FormItemAgenda
def adiciona(request):
form = FormItemAgenda(request.POST or None, request.FILES or None)
if form.is_valid():
form.save()
return redirect("/")
return render(request, "adiciona.html", {'form': form})
ModelForm
Arqui vo:
agenda/
views.py
Verso
aprimorada
Formulrios
Formulrios
Mensagens em portugus:
Mudar opo
LANGUAGE_CODE
para
'pt-br'
no arqui vo
settings.py
Editando objetos
http://localhost:8000/item/1
from django.conf.urls.defaults import *
# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()
urlpatterns = patterns('',
# Example:
# (r'^gerenciador/', include('gerenciador.foo.urls')),
(r'^$', 'agenda.views.lista'),
(r'^adiciona/$', 'agenda.views.adiciona'),
(r'^item/(?P<nr_item>\d+)/$', 'agenda.views.item'),
:
)
Exibindo objetos
Arqui vo:
urls.py
def item(request, nr_item):
item = get_object_or_404(ItemAgenda, pk=nr_item)
form = FormItemAgenda(request.POST or None,
request.FILES or None, instance=item)
if form.is_valid():
form.save()
return redirect("/")
return render(request, "item.html", {'form': form})
ModelForm
Arqui vo:
agenda/
views.py
{% extends 'base.html' %}
{% block corpo %}
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Atualizar</button>
</form>
{% endblock %}
ModelForm
Arqui vo:
templates/
item.html
ModelForm
Atividades

Adicionar a
funcionalidade de
remoo

de item com
conrmao
Agenda Multiusurio
Segurana

Aplicao: django.contrib.auth

Requer aplicaes:

django.contrib.sessions

django.contrib.contenttypes

Models:

User

Group

Permission

Sistema de perl de usurio


from django.db import models
from django.contrib.auth.models import User
class ItemAgenda(models.Model):
data = models.DateField()
hora = models.TimeField()
titulo = models.CharField(max_length=100)
descricao = models.TextField()
usuario = models.ForeignKey(User)
Segurana
Arqui vo:
agenda/
models.py
ItemAgenda
data: Date
hora: Time
titulo: Varchar(100)
descricao: Blob
(FK)usuario: User
User
(aula) gerenciador$ rm gerenciador.db
(aula) gerenciador$ ./manage.py syncdb
Creating table auth_permission
Creating table auth_group
Creating table auth_user
Creating table auth_message
Creating table django_content_type
Creating table django_session
:
:
Would you like to create one now? (yes/no): yes
Username (Leave blank to use 'osantana'): dead_parrot
E-mail address: dead_parrot@montypython.co.uk
Password: XXXXX
Password (again): XXXXX
Superuser created successfully.
:
Segurana
# -*- encoding: utf-8 -*-
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required
from models import ItemAgenda
from forms import FormItemAgenda
@login_required
def lista(request):
lista_itens = ItemAgenda.objects.filter(usuario=request.user)
return render(request, "lista.html", {'lista_itens': lista_itens})
Segurana
Arqui vo:
agenda/
views.py
@login_required
def adiciona(request):
form = FormItemAgenda(request.POST or None,
request.FILES or None)
if form.is_valid():
item = form.save(commit=False)
item.usuario = request.user
item.save()
return redirect("/")
return render(request, "adiciona.html", {'form': form})
Segurana
Arqui vo:
agenda/
views.py
@login_required
def item(request, nr_item):
item = get_object_or_404(ItemAgenda, usuario=request.user, pk=nr_item)
form = FormItemAgenda(request.POST or None,
request.FILES or None, instance=item)
if form.is_valid():
form.save()
return redirect("/")
return render(request, "item.html", {'form': form})
Segurana
Arqui vo:
agenda/
views.py
@login_required
def remove(request, nr_item):
item = get_object_or_404(ItemAgenda, usuario=request.user, pk=nr_item)
if request.method == "POST":
item.delete()
return redirect("/")
return render(request, "remove.html", {'item': item})
Segurana
Arqui vo:
agenda/
views.py
LOGIN_URL = "/login/"
LOGOUT_URL = "/logout/"
LOGIN_REDIRECT_URL = "/"
Segurana
Arqui vo:
settings.py
:
urlpatterns = patterns('',
# Example:
# (r'^gerenciador/', include('gerenciador.foo.urls')),
(r'^$', 'agenda.views.lista'),
(r'^adiciona/$', 'agenda.views.adiciona'),
(r'^item/(?P<nr_item>\d+)/$', 'agenda.views.item'),
(r'^remove/(?P<nr_item>\d+)/$', 'agenda.views.remove'),
(r'^login/$', 'django.contrib.auth.views.login',
{'template_name': 'login.html' }),
(r'^logout/$', 'django.contrib.auth.views.logout_then_login',
{'login_url': '/login/'}),
Segurana
Arqui vo:
urls.py
{% extends "base.html" %}
{% block corpo %}
{% if form.errors %}
<p>Seu usurio e senha no conferem. Tente novamente.</p>
{% endif %}
<form action="" method="post">
{% csrf_token %}
<table>
<tr><td>{{form.username.label_tag}}</td><td>{{form.username}}</td></tr>
<tr><td>{{form.password.label_tag}}</td><td>{{form.password}}</td></tr>
<tr><td colspan="2"><button type="submit">Login</button></td></tr>
</table>
</form>
{% endblock %}
Segurana
Arqui vo:
templates/
login.html
{% extends 'base.html' %}
{% block corpo %}
<p><a href="/logout/">logout</a></p>
<p><a href="/adiciona/">Adicionar novo item</a></p>
<ul>
{% for item in lista_itens %}
<li>
<a href="/remove/{{item.id}}">remover</a>
<a href="/item/{{item.id}}">
{{ item.data|date:"d/m/Y" }} - {{ item.titulo }}
</a>
</li>
{% empty %}
<li>Sem itens na lista</li>
{% endfor %}
</ul>
{% endblock %}
Segurana
Arqui vo:
templates/
lista.html
Segurana
Admin

Adicione 'django.contrib.admin' na opo


INSTALLED_APPS do settings.py

Remova comentrios relacionados a admin


do urls.py

Rode novamente ./manage.py syncdb

Crie um arquivo agenda/admin.py contendo...

Desabilite a aplicao staticles em


INSTALLED_APPS
from gerenciador.agenda.models import ItemAgenda
from django.contrib import admin
admin.site.register(ItemAgenda)
Admin
Arqui vo:
agenda/
admin.py
Admin
Admin
Admin
Admin
from gerenciador.agenda.models import ItemAgenda
from django.contrib import admin
class ItemAgendaAdmin(admin.ModelAdmin):
fields = ('data', 'hora', 'titulo', 'descricao')
list_display = ('data', 'hora', 'titulo')
def queryset(self, request):
qs = super(ItemAgendaAdmin, self).queryset(request)
return qs.filter(usuario=request.user)
def save_model(self, request, obj, form, change):
obj.usuario = request.user
obj.save()
admin.site.register(ItemAgenda, ItemAgendaAdmin)
Admin
Arqui vo:
agenda/
admin.py
Admin
Django ORM
from django.db import models
from django.contrib.auth.models import User
class ItemAgenda(models.Model):
data = models.DateField()
hora = models.TimeField()
titulo = models.CharField(max_length=100)
descricao = models.TextField()
usuario = models.ForeignKey(User)
participantes = models.ManyToManyField(User,
related_name='item_participantes')
Relacionamentos
Arqui vo:
agenda/
models.py
from django import forms
from django.contrib.auth.models import User
from agenda.models import ItemAgenda
class ModelMultipleUserField(forms.ModelMultipleChoiceField):
def label_from_instance(self, user):
return u"%s (%s)" % (user.get_full_name(), user)
class FormItemAgenda(forms.ModelForm):
data = forms.DateField(
widget=forms.DateInput(format='%d/%m/%Y'),
input_formats=['%d/%m/%Y', '%d/%m/%y'])
participantes = ModelMultipleUserField(queryset=User.objects.all())
class Meta:
model = ItemAgenda
fields = ('titulo', 'data', 'hora', 'descricao', 'participantes')
Relacionamentos
Arqui vo:
agenda/
forms.py
Relacionamentos
$ ./manage.py shell
Python 2.5.1 (r251:54863, Feb 6 2009, 19:02:12)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from agenda.models import ItemAgenda as ia
>>> print ia.objects.all()
[<ItemAgenda: ItemAgenda object>, <ItemAgenda: ItemAgenda object>,
<ItemAgenda: ItemAgenda object>]
>>> print ia.objects.get(pk=1)
ItemAgenda object
>>> print ia.objects.filter(data__month=8)
[<ItemAgenda: ItemAgenda object>]
>>> print ia.objects.order_by('-data')
[<ItemAgenda: ItemAgenda object>, <ItemAgenda: ItemAgenda object>,
<ItemAgenda: ItemAgenda object>]
Manipulando Queries
>>> from django.db import connection, transaction
>>> cursor = connection.cursor()
>>> c = cursor.execute("SELECT * FROM agenda_itemagenda")
>>> cursor.fetchall()
[(1, datetime.date(2009, 4, 25), datetime.time(12, 0), u'foo', u'bar', 1),
(2, datetime.date(2009, 8, 20), datetime.time(23, 41, 17), u'bla', u'blek',
1), (3, datetime.date(2000, 1, 10), datetime.time(20, 0), u'6', u'foo', 1)]
>>> c = cursor.execute("UPDATE agenda_itemagenda SET titulo='novo titulo'
WHERE id=1")
>>> transaction.commit_unless_managed()
>>> c = cursor.execute("SELECT * FROM agenda_itemagenda")
>>> cursor.fetchall()
[(1, datetime.date(2009, 4, 25), datetime.time(12, 0), u'novo titulo',
u'bar', 1), (2, datetime.date(2009, 8, 20), datetime.time(23, 41, 17),
u'bla', u'blek', 1), (3, datetime.date(2000, 1, 10), datetime.time(20, 0),
u'6', u'foo', 1)]
Executando SQL
Signals & E-Mail
def envia_email(**kwargs):
print "Implementar..."
models.signals.post_save.connect(envia_email,
sender=ItemAgenda,
dispatch_uid="agenda.models.ItemAgenda")
Signals
Arqui vo:
agenda/
models.py
from datetime import datetime
def envia_email(**kwargs):
try:
item = kwargs['instance']
except KeyError:
return
for participante in item.participantes.all():
if participante.email:
dados = (item.titulo,
datetime.strftime(item.data, "%d/%m/%Y"),
item.hora)
participante.email_user(
subject="[evento] %s dia %s as %s" % dados,
message="Evento: %s\nDia: %s\nHora: %s" % dados,
from_email=item.usuario.email
)
E-mail
Arqui vo:
agenda/
models.py
DEFAULT_FROM_EMAIL = "eventos@empresa.com"
EMAIL_HOST='smtp.empresa.com'
EMAIL_PORT=587
EMAIL_HOST_USER="eventos"
EMAIL_HOST_PASSWORD="senha123"
EMAIL_USE_TLS=True
E-mail
Arqui vo:
settings.py
Signals & E-Mail
Outras funes

Arquivos estticos e de mdia

GeoDjango (aplicaes GIS)

Internacionalizao e Localizao

Funes locais (ex. CPF, CNPJ, CEP, )

Aplicaes de comentrios, moderao,

Servios de segurana: signed cookies,


CSRF Protection, Clickjacking protection

Cache multi-backend

Pginas planas, multisite, etc.


Referncias

Python
http://www.python.org/
http://www.python.org.br/

Django
http://www.djangoproject.com/
http://www.djangobook.com/
http://www.djangobrasil.org/

Geral
http://www.pythonologia.org/
http://triveos.ludeos.com.br/
Cursos online
http://www.ludeos.com.br
http://db.tt/j2wwFvX3

Você também pode gostar