Escolar Documentos
Profissional Documentos
Cultura Documentos
Mdulo
1
Bsico
[ w w w . w e b 2 p y b r a s i l . c o m . b r , w w w . t e m p o r e a l e v e n t o s . c o m . b r ]
http://www.temporealeventos.com.br ]
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
Introduo
O que web2py?
web2py um framework para desenvolvimento Web escrito em Python, software
livre e gratuito, que tem como um de seus principais objetivos proporcionar agilidade
no desenvolvimento de aplicaes web seguras, baseadas em bancos de dados.
O framework segue o modelo MVC (Model-View-Controller), que permite melhor
organizao do cdigo. Ele tambm autocontido, ou seja, tudo o que voc precisa
para desenvolver alguma aplicao est nele, basta baixar e descompactar para
comear - nada de configuraes!
Com o foco em permitir que o desenvolvedor pense apenas na aplicao que est
desenvolvendo, o web2py possui integrao com mais de 10 sistemas de banco de
dados e vrios subsistemas, como: criao automtica de formulrios com validao
automtica; autenticao e autorizao; gerador de cdigos AJAX para melhor
interao do usurio com a aplicao; upload seguro de arquivos; sistema de
plugins; integrao com vrios padres web (XML, RSS etc.), dentre outros.
O web2py leva em considerao todas as questes referentes segurana da
aplicao web, e isso significa que o framework se preocupa em tratar as
vulnerabilidades aplicando prticas bem estabelecidas, como, por exemplo,
validando formulrios com preveno de injeo de cdigo malicioso; efetuando o
correto escape da sada HTML para prevenir ameaas como o cross-site scripting e
renomeando os arquivos de upload utilizando hash seguro. O web2py toma conta,
automaticamente, de questes de segurana.
SQLite
MySQL
PostgreSQL
MSSQL
FireBird
Oracle
IBM DB2
Informix
Ingres
Google BigTable on Google App engine GAE
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
Princpios
A linguagem Python tipicamente segue os seguintes princpios
No se repita (DRY)
Deve existir apenas uma maneira bvia para fazer algo
Explcito melhor do que implcito
O web2py procura seguir rigorosamente os dois primeiros princpios, para estimular
o desenvolvedor a utilizar boas prticas de engenharia de software, seguindo um
bom padro de projeto (MVC) e incentivando o reaproveitamento de cdigo. O
framework guia o desenvolvedor, facilitando as tarefas mais comuns em
desenvolvimento para web.
Diferente de outros frameworks, o web2py aplica parcialmente o terceiro princpio.
Com a inteno de prover o desenvolvimento gil, o framework efetua
configuraes, importa mdulos e instancia objetos globais como session, request,
cache,Translation. Tudo isso feito automaticamente, com a inteno de evitar, ao
mximo, que o desenvolvedor tenha que importar os mesmos mdulos e instanciar
os mesmos objetos no incio de cada model ou controller.
Efetuando automaticamente estas operaes, o web2py evita problemas e mantm
o princpio de no se repetir e de que deve existir apenas uma maneira para se fazer
algo. Porm, se o desenvolvedor desejar, este comportamento pode ser alterado,
possibilitando que em qualquer cenrio seja possvel importar mdulos (como ocorre
em qualquer outra aplicao ou framework Python).
Este treinamento objetiva introduzir os alunos ao desenvolvimento web com Python,
utilizando o web2py como ferramenta, e pretender apresentar todas as vantagens da
utilizao de um framework. Para acompanhar o treinamento, os pr-requisitos
necessrios so conhecimentos bsicos de HTML, CSS e lgica de programao
(em qualquer linguagem).
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
Executando o Python
Esta apostila no abordar a instalao do interpretador Python. A maioria dos
sistemas operacionais baseados em Unix, como Ubuntu, MacOs e outras
distribuies Linux, j costumam vir com Python instalado. O Python tambm pode
ser instalado/executado em qualquer verso do Windows; para isso, basta seguir as
dicas de instalao encontradas em http://www.python.org.br
Considerando que seu sistema operacional j esteja pronto para executar o
interpretador Python em modo interativo, inicie uma janela de terminal
Linux/Unix/MacOS, ou um prompt de comando no Windows, e digite:
1.
python
Modo interativo
Ao iniciar o interpretador Python, ser carregado um console interativo. Qualquer
comando digitado neste console ser interpretado pelo Python.
1.
2.
3.
4.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
Ol Mundo em Python
O comando print imprime qualquer objeto que seja do tipo string ou que possa ser
serializado como string. Isso vale para textos, nmeros, objetos, estruturas de dados
e muito mais.
1.
2.
3.
4.
5.
No console interativo no obrigatrio utilizar a funo print para imprimir alguma coisa, pois neste modo
o Python sempre responde com o retorno padro do objeto.
Portanto, omitindo o comando print...
1. >>> 'Ol Mundo'
2. Ol Mundo
... teremos o mesmo resultado.
Mas fique atento, sempre que escrevemos programas em arquivos .py, necessrio utilizar a funo print.
Clculos
O Console Python responde a operadores matemticos da mesma forma que uma
calculadora.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
>>> (5+2)*9
63
>>> 50+50
100
>>> 7/2
3 # Ops tem algo errado, 7/2 no 3.5? Sim mas neste caso Python arredonda para baixo
>>> 7.0/2
3.5 # passando um nmero do tipo **float** o retorno tambm ser **float**
>>> "Brasil "*3 # Python tambm multiplica **strings**
'Brasil Brasil Brasil'
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
Objetos
Em Python, qualquer coisa um objeto: uma classe, um mtodo, uma funo, um
texto ou um nmero. Qualquer tipo de dado, como int e string, por exemplo, tambm
objeto e se comporta como objeto.
Isso quer dizer que qualquer coisa em Python pode ser passada como parmetro para uma funo ou
mtodo, pois qualquer coisa um objeto, e tambm quer dizer que qualquer objeto pode conter atributos e
mtodos (mas veremos isso mais adiante).
Vamos, por exemplo, utilizar o comando help passando como parmetro o nmero
inteiro 1. 1 um objeto do tipo int (inteiro); quando passarmos 1 para a
funo help teremos como resposta uma descrio detalhada a respeito da
classe int e todos os seus mtodos. Levando em conta que 1 uma instncia da
classe int, podemos ento utilizar qualquer mtodo de int em 1.
Veja o resultado:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
>>> help(1)
Help on int object:
class int(object)
| int(x[, base]) -> integer
|
| Convert a string or number to an integer, if possible. A floating point
| argument will be truncated towards zero (this does not include a string
| representation of a floating point number!) When converting a string, use
| the optional base. It is an error to supply a base when converting a
| non-string. If base is zero, the proper base is guessed based on the
| string content. If the argument is outside the integer range a
| long object will be returned instead.
|
| Methods defined here:
|
| __abs__(...)
|
x.__abs__() <==> abs(x)
: ( continua.....)
Perceba que aqui s mostramos uma pequena parte do retorno de help, pois a lista
de mtodos muito grande. O mesmo resultado pode ser obtido utilizando a prpria
classe int:
1. >>> help(int)
help exibe uma documentao muito detalhada, e s vezes queremos ver apenas
uma listagem de mtodos disponveis em um certo objeto - para isso, utilizamos o
comando dir.
Perceba que dir e help tambm so objetos, so funes que aqui chamaremos de comandos, apenas
para diferenciar as funes da linguagem Python das funes de um programa especfico, criado por voc
ou no.
Tente executar help(dir) ou dir(help) e veja o resultado:
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
>>> dir(1)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__',
'__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__',
'__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__',
'__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__',
'__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__',
'__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__',
'__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__',
'__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__',
'__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'conjugate', 'denominator',
'imag', 'numerator', 'real']
Acima esto listados todos os mtodos disponveis na classe int que podem ser
chamados a partir do objeto 1.
Veja como invocar um mtodo a partir de um objeto:
1. >>> objeto = 234 #Criamos uma variavel(objeto) e atribuimos o valor inteiro 234
2. >>> objeto.__hex__() #O mtodo __hex__() da classe **int** converte para hexadecimal
3. '0xea'
Tipos dinmicos
O Python efetua tipagem dinmica dos objetos, uma varivel no precisa possuir um
tipo especfico de dados, e as variveis tambm no precisam ser declaradas.
Considere uma varivel Python como sendo um espao em memria que pode
receber referncia para objetos com valores de qualquer tipo. Portanto, so os
valores que possuem tipo, e este tipo definido dinamicamente.
Podemos verificar qual o tipo de dado de um valor utilizando o comando type:
1.
2.
3.
4.
5.
6.
7.
8.
9.
>>>type(1)
<type 'int'>
>>>type(1.25)
<type 'float'>
>>>type('texto')
<type 'str'>
>>>variavel = 'Mensagem'
>>>type(variavel)
<type 'str'>
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
10
str (strings)
Python suporta o uso de dois tipos de string: ASCII e Unicode.
ASCII so as strings usuais delimitadas por '...', "..." ou por """...""". Trs aspas
delimitam strings com mltiplas linhas. Strings Unicode devem comear com uma
letra u, seguida da string.
Unicode pode ser convertido para ASCII e vice-versa. Por padro, o web2py utiliza
UTF8 para strings.
Estruturas de dados
Listas
Listas so colees heterogneas de objetos, que podem ser de qualquer tipo,
inclusive outras listas.
As listas no Python so mutveis, podendo ser alteradas a qualquer momento.
Elementos de uma lista podem ser acessados atravs de seu ndice.
Sintaxe
1. lista = [a, b, ..., z]
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
11
Tuplas
Tuplas so semelhantes s listas, porm so imutveis: no se pode acrescentar,
apagar ou fazer atribuies aos itens.
Sintaxe:
1. >>> minhatupla = (a, b, ..., z) # parnteses opcionais
2. >>> minhatupla = a, b, ..., z # o resultado o mesmo
3. >>> minhatuple = ( 1, ) # Tuplas com apenas um item terminam com uma vrgula
http://www.temporealeventos.com.br ]
12
>>> a = 2, 3, 'hello'
>>> x, y, z = a
>>> print x
2
>>> print z
hello
Dicionrios
Um dicionrio uma lista de associaes compostas por uma chave nica e
estruturas correspondentes. Dicionrios so mutveis, tais como as listas.
Os dados nos dicionrios so armazenados em uma estrutura chave:valor
1. >>> pessoa = {'nome':'Joo','idade':35,'altura':1.69}
>>> pessoa['nome']
'Joo'
>>> pessoa['idade']
35
>>> Pessoa['Peso'] = 67
>>> pessoas = {}
>>> pessoas['Bruno'] = {'idade':27,'Cidade':'Cotia'}
>>> pessoas['Claudia'] = {'idade':29,'Cidade':'Taubate'}
>>> pessoas
{'Claudia': {'idade': 29, 'Cidade': 'Taubate'}, 'Bruno': {'idade': 27, 'Cidade': 'Cotia'}}
>>> pessoas['Claudia']
{'idade': 29, 'Cidade': 'Taubate'}
>>> pessoas['Claudia']['idade']
29
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
13
No caso acima o objeto pessoas um dicionrio, e possui dentro dele outros dois
dicionrios identificados pelas chaves 'Bruno' e 'Claudia'. Esses dois dicionrios, por
sua vez, tambm armazenam um dicionrio dentro de si, cada um com as chaves
'idade' e 'cidade'. Poderamos ir mais longe e incluir inmeros dicionrios aninhados.
As chaves nos dicionrios podem ser dos tipos int, string ou qualquer objeto que
implemente o mtodo __hash__. Valores podem ser de qualquer tipo, podemos ter
diferentes tipos de chaves e valores em um nico dicionrio. Se os valores forem
todos alfanumricos, o dicionrio pode ser declarado com a sintaxe alternativa:
1.
2.
3.
4.
5.
>>> pessoas.keys()
['Claudia', 'Bruno']
>>> pessoas.values()
[{'idade': 29, 'Cidade': 'Taubate'}, {'idade': 27, 'Cidade': 'Cotia'}]
>>> pessoas.items()
[('Claudia', {'idade': 29, 'Cidade': 'Taubate'}), ('Bruno', {'idade': 27, 'Cidade': 'Cotia'})]
O mtodo items produz uma lista de tuplas, cada uma contendo a chave e seu
respectivo valor. Esta sada muito til para efetuar operaes como esta:
1.
2.
3.
4.
5.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
14
Internamente, o Python usa o operador hash para converter objetos para int, e utiliza este valor inteiro para
determinar onde armazenar o valor.
Sobre endentao
Dentro da computao, Endentao (recuo, neologismo derivado da palavra em ingls indentation,
tambm encontram-se as formas identao e indentao) um termo aplicado ao cdigo fonte de um
programa para indicar que os elementos hierarquicamente dispostos tm o mesmo avano relativamente
posio (x,0).
Na maioria das linguagens a indentao tem um papel meramente esttico, tornando a leitura do cdigo
fonte muito mais fcil (read-friendly), porm obrigatria em outras. Python, occam e Haskell, por
exemplo, utilizam-se desse recurso tornando desnecessrio o uso de certos identificadores de blocos
("begin" e/ou "end").
Fonte:wikipedia
Python usa a endentao para delimitar blocos de cdigo. Um bloco inicia-se com
uma linha terminada em dois pontos (:), e continua para todas as linhas que tenham
uma endentao similar ou mais recuada. Por exemplo:
1.
2.
3.
4.
5.
6.
7.
8.
>>> i = 0
>>> while i < 3:
>>> print i
>>> i = i + 1
>>>
0
1
2
comum utilizar 4 espaos para cada nvel de endentao. uma boa prtica no
misturar espaos com tabulaes, pois pode gerar problemas.
Iterao de elementos
Em Python voc pode efetuar loops em objetos iterveis utilizando os
comandos for...in e while:
1.
2.
3.
4.
5.
6.
7.
8.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
15
1.
2.
3.
4.
5.
6.
while
while (enquanto) em Python funciona de maneira muito similar a outras linguagens.
Este comando efetua a repetio indefinidas vezes, testando uma condio no final
de cada iterao at que a condio seja igual a False
1.
2.
3.
4.
5.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
16
Expresses condicionais
O uso de condies em Python intuitivo:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
elif o mesmo que else if, e voc pode ter quantos elifs desejar, mas s
permitido apenas um else sempre como ltima condio do bloco.
Funes
Funes so blocos de cdigo nomeados. Criadas para permitir a reutilizao de
cdigo, as funes podem receber argumentos. Algumas funes j esto presentes
no interpretador Python.
Exemplo de funo
1. >>> def nome_da_funcao(argumento1, argumento2):
2. ... bloco de cdigo
3. ... return <resultado>
O web2py segue o estilo de marcao determinado no PEP-8 , por isso ser comum ver funes
nomeadas com o uso de 'underline', ex: nome_da_funcao. Porm, voc pode preferir utilizar outro estilo,
como camelCasing ou PascalCasing na hora de criar as suas prprias funes.
Retorno de valores
Se a funo retorna algum valor, como no caso de uma soma ou outro tipo de
tratamento de dado, utilizado o comando return para especificar o que ser
retornado.
1.
2.
3.
4.
5.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
17
Uma nica funo poder retornar mais de um objeto, e uma funo pode receber
argumentos nomeados:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
lambda
Expresses lambda so funes que no possuem nome e que so criadas
dinamicamente:
1.
2.
3.
4.
5.
6.
7.
A expresso lambda [a]:[b] pode ser lida como: uma funo que recebe o
argumento a e retorna o valor b. Mesmo sendo uma funo sem nome, ela pode ser
referenciada por uma varivel soma_alterada e desta maneira possvel invoc-la.
lambda muito til para efetuao de refatoramento e sobrecarga (overloading) de
mtodos e funes.
Comentrios e docstrings
Existem duas maneiras para inserir um comentrio em Python. Para comentrios
gerais no meio do bloco de cdigo, basta utilizar o caractere #
1. >>> def funcao(): # aqui definimos uma funo
2. ... # na linha abaixo retornamos o valor
3. ... return <valor>
http://www.temporealeventos.com.br ]
18
'
Mdulos
Cada arquivo em Python chamado de mdulo. Mdulos so conjuntos de cdigos
como funes, classes, mtodos, variveis etc.
Vrios mdulos podem se comunicar atravs do comando import modulo.
Vamos pegar o seguinte mdulo como exemplo:
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
19
Importando diretamente:
desta forma todos os objetos definidos em modulox ficam diretamente disponveis para acesso
dentro do programa atual, e ainda temos a opo de escolher quais objetos iremos importar.
List Comprehensions
Compreenso de listas uma construo que permite processar listas de uma
maneira muito similar linguagem matemtica.
A sintaxe [<expresso> for <varivel> in <lista> if <condicao>]
onde: <varivel> in <lista> pode se repetir N vezes.
e a <condio> opcional.
Vamos utilizar a funo soma, por exemplo:
1. >>> print [modulox.soma(numero,5) for numero in range(10) if numero!=5]
2. [5, 6, 7, 8, 9, 11, 12, 13, 14]
Referncias
[1] "www.python.org/dev/peps"
[2] "http://www.python.org.br/wiki/InicieSe"
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
20
WSGI
Tambm pronunciado como uisgui, WSGI a especificao que determina os
padres de acesso e comunicao entre servidores web e aplicaes escritas em
Python. WSGI descrito em detalhes no PEP 333
WSGI no foi feito para desenvolvimento de aplicativos, mas sim para desenvolvimento de frameworks e
webservers.
Yield, em Python, usado nos generators. Generators so uma forma de gerar iterators. O yield faz com
que a funo pare onde ele for chamado, e que na prxima vez em que for chamado, os valores sejam os
mesmos da vez anterior.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
21
O Padro MVC
O padro de MVC (Model-View-Controller) possibilita uma separao inteligente
entre o modelo de dados (Model), a lgica da aplicao (Controller) e a interface de
apresentao (View).
Modelos (model)
o local onde definimos e gerenciamos os modelos de dados da aplicao,
efetuamos conexes com bancos de dados e definimos a modelagem das tabelas,
constantes, variveis e configuraes de acesso global.
Controladores (controller)
So as aes da aplicao, onde definimos as regras de negcio e as validaes de
tempo de execuo.O controller quem recebe a entrada de dados, invoca os
objetos do modelo de dados, efetua as validaes e envia como resposta uma viso.
Viso (view)
As vises apresentam os dados do model, invocados e tratados pelo controller.
Podem ser qualquer tipo de interface com usurios (pginas HTML, Feeds RSS etc)
ou com outros sistemas (XML webservices, API REST etc).
Referncias
[1] "http://www.python.org/dev/peps"
[2] "http://wsgi.org/wsgi"
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
22
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
23
A aplicao welcome:
Clique em [click here for admin...] e entre com a senha definida no passo anterior.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
24
Aps voc clicar em [create], a aplicao ser criada como uma cpia da
aplicao welcome.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
25
A pgina de edio exibe o que existe dentro da aplicao. Toda aplicao web2py
consiste em um certo conjunto de arquivos; os mais importantes esto nas seguintes
categorias:
[models]
Modelos o local onde definimos e gerenciamos os modelos de dados da
aplicao, efetuamos conexes com bancos de dados e definimos a modelagem das
tabelas, constantes, variveis e configuraes de acesso global.
[controllers]
Controladores So as aes da aplicao. Aqui definimos as regras de negcio e
as validaes de tempo de execuo; o controller quem recebe a entrada de
dados, invoca os objetos do modelo de dados, efetua as validaes e envia como
resposta uma viso.
[views]
Vises So as vises que serviro para apresentar os dados do model, invocados
e tratados pelo controller. So criadas a partir de templates que podem responder
contedo no formato HTML, RSS, XML e JSON, entre outros.
[languages]
Linguagens Local onde definimos arquivos de linguagem que permitem a
internacionalizao das aplicaes.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
26
[static]
Estticos Neste diretrio, inserimos arquivos que no necessitam de
processamento, como estruturas estticas de layout, imagens, arquivos de estilo
CSS e JavaScript.
[modules]
Mdulos - Aqui colocaremos bibliotecas e mdulos Python que no fazem parte do
web2py, mas que podem ser importados e utilizados nas aplicaes.
Cada arquivo ou pasta exibido na interface administrativa, corresponde a um arquivo fsico localizado no
diretrio da aplicao. Qualquer operao realizada na interface administrativa pode ser realizada atravs
de comandos de terminal, e os arquivos podem ser editados em qualquer editor de textos ou IDE.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
27
A partir do zero
Vamos criar uma aplicao a partir do zero. Abra a pasta web2py/applications e
dentro dela crie uma nova pasta chamada myappzero.
Dentro desta pasta criaremos os arquivos essenciais para que esta pasta se
transforme em uma aplicao web2py.
__init__.py
Este arquivo informa ao interpretador que esta pasta um pacote Python e desta
forma poder ser executado como aplicao web2py. Este arquivo nomeado com
dois underlines, no incio e no final, __init__.py, e no possui contedo.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
28
ABOUT
Este arquivo conter a descrio de sua aplicao. Ele um arquivo obrigatrio,
apesar de ser permitido que fique em branco. Recomenda-se que seja preenchido
pelo menos com as informaes bsicas: descrio da aplicao, verso e nome do
autor. interessante informar, neste arquivo, alguma dependncia que a aplicao
possa ter, e incluir instrues de instalao e configurao.
LICENSE
Este arquivo conter a declarao de licena para o software desenvolvido com
web2py. A licena do web2py permite que a aplicao seja distribuda de forma
comercial, desde que tenha seu prprio arquivo de licena.
controllers
Nesta pasta criaremos os arquivos que contero a lgica principal da aplicao. Em
cada um destes arquivos criaremos as funes Python que chamaremos de aes,
e cada ao ser mapeada para uma URL:
http://servidor/aplicao/controller/ao/argumento1/argumento2
models
Nesta pasta criaremos os modelos de dados e as configuraes globais. Os
arquivos dentro de models sero executados em ordem alfabtica.
views
Nesta pasta criaremos os arquivos de layout e as vises para a apresentao dos
dados. O contedo da pasta myappzero, passar a ser uma aplicao web2py.
Modelos (models)
Vamos comear pelos modelos. De acordo com a especificao do padro MVC, os
modelos devem tratar apenas das estruturas e modelos de dados, porm o web2py
d ao desenvolvedor a flexibilidade de escrever qualquer tipo de cdigo Python
dentro do nvel dos modelos.
O web2py l os arquivos de modelo em ordem alfabtica e executa todo cdigo
contido nestes arquivos; instncia objetos e variveis de acesso global; executa
funes; conecta, modela, verifica e cria tabelas no banco de dados.
Para entender o ciclo de vida de uma aplicao web2py, crie um arquivo
chamado modelo1.py dentro da pasta applications/myappzero/models:
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
29
1.
2.
3.
4.
5.
6.
7.
Quando inclumos o comando print em qualquer arquivo de uma aplicao web2py, esta informao
enviada para o terminal onde o web2py est sendo executado. Este um recurso muito til para depurar a
aplicao.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
30
Nos modelos modelo1 e modelo2 criamos e instanciamos globalmente os objetos: lista1, lista2 e meses.
Estes objetos esto agora disponveis para acessarmos atravs dos controladores e das views.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
31
Controladores (controllers)
Agora vamos criar um arquivo controlador. Um controlador o responsvel pela
execuo de tarefas lgicas da aplicao, tratamento de dados e comunicao com
as vises. Nos controladores criamos funes Python que chamamos de aes e
cada ao poder ser mapeada para uma URL. As aes podem responder para
uma ou mais vises, assim como as vises podero responder por uma ou mais
aes. Os controladores tm acesso a todos os objetos que esto instanciados no
escopo global da aplicao.
Dentro da pasta controllers, crie um arquivo chamado controlador1.py.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
32
Mapeamento de URLs
O mapeamento de URLs (dispatching) no web2py orientado a aes dos
controladores. Cada ao de um controlador acessvel atravs de uma URL no
seguinte formato:
http://servidor:porta/aplicao/controlador/ao/argumentos?variveis
http://servidor:porta
Endereo IP e porta do servidor, em desenvolvimento 127.0.0.1:8080
/aplicao
Pasta da aplicao web2py, ao ser chamada executa o cdigo dos modelos
/controlador
Mdulo controlador
/ao
Ao de um controlador, ao ser chamada executa o cdigo da funo
correspondente, recebe os parmetros e variveis
/argumentos
Argumentos passados para o controlador so tratados como POST
?variveis
Variveis so tratadas como GET (QueryString)
Para uma completa lista dos objetos de contexto visite a seguinte URL:
http://127.0.0.1:8000/examples/simple_examples/status
Vises (views)
Vises so modelos HTML, RSS, JSON, XML ou qualquer outro tipo de modelo para
apresentao das informaes. Por exemplo: tudo o que for apresentado ao
navegador web faz parte da viso.
No web2py, o template das vises marcado utilizando linguagem Python, e
podemos fazer quase tudo que faramos em um programa Python ou Controller
diretamente dentro da View. Apesar de ser recomendado deixar a lgica toda no
Controller, s vezes muito til colocar um pouco de inteligncia nas Views.
O padro para marcao segue os modelos abaixo, e os demais detalhes veremos
no decorrer:
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
33
Este arquivo conter o template para exibio dos dados da acao1, e poderemos
executar qualquer cdigo Python dentro dele. Todos os objetos que foram
retornados pelos modelos e controlador estaro disponveis para a viso:
1. <html>
2.
<head></head>
3.
<body>
4.
{{print '_'*80}}
5.
{{print 'Viso exibida no navegador'}}
6.
{{=lista1}}
7.
<br />
8.
{{=lista2}}
9.
<br />
10.
<ul>
11.
{{for mes in meses:
12.
if mes:
13.
}}
14.
<li>{{=mes}}</li>
15.
{{ pass
16.
pass
17.
}}
18.
</ul>
19.
</body>
20. </html>
21.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
34
Acesse o endereo:
http://127.0.0.1:8000/myappzero/controlador1/acao1/argumento1?variavel1=valor1
Repare que estamos passando um primeiro argumento com o valor argumento1 e
uma queryString com a chave variavel1 de valor1.
A sada em seu navegador dever ser:
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
35
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
36
O cdigo acima define uma referncia db para uma instncia da classe DAL,
mapeada para um banco de dados do tipo sqlite com o nome storage.db, por
padro armazenado na pasta databases.
Table representa uma tabela no banco de dados, voc no pode
instanciar Table diretamente: para isso usamos o
mtodo DAL.define_table
1. db.define_table('minhatabela', Field('meucampo'))
db.minhatabela.truncate()
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
37
db.define_table('minhatabela',
Field('meucampo', 'string'),
)
db.minhatabela.notnull=True
db.minhatabela.required=True
db.minhatabela.requires=IS_NOT_EMPTY()
db.minhatabela.default='Ol Mundo'
Este cdigo poderia ser traduzido para o fragmento minhatabela where meu
campo = 'Teste', e esta query pr-definida poder ser aplicada ao objeto Set.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
38
1.
2.
3.
4.
5.
6.
7.
8.
# definir o conjunto de registros ' SELECT * FROM minhatabela where meucampo = 'Teste'
conjunto = db(minhaquery)
# executar o select acima e popula o objeto registros
registros = conjunto.select()
# alterar os registros 'UPDATE minhatabela set meucampo = 'Teste2' where meucampo =
'Teste'
conjunto.update(meucampo='Teste2')
# deletar os registros 'DELETE FROM minhatabela where meucampo = 'Teste'
conjunto.delete()
Representao de registros
Este argumento opcional, porm, muito til para a criao dos formulrios, pois
esta representao ser utilizada para popular os drop-downs de referncia.
Exemplo:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
db.define_table('pessoa',
Field('nome'),
format='%(name)s',
)
# ou
db.define_table('pessoa',
Field('nome'),
format='%(name)s %(id)s',
)
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
39
Nos trs casos acima, estamos definindo qual ser o padro de representao desta
tabela, quando ela for referenciada em um drop-down. Ao invs de utilizar o
campo id, o web2py usar a representao definida em format.
Vamos criar uma tabela chamada carros, contendo os campos marca e modelo:
1. >>> banco.define_table('carros',Field('marca'),Field('modelo'))
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
40
>>> banco.carros.insert(marca='GM',modelo='Corsa')
1
>>> banco.carros.insert(marca='AUDI',modelo='A4')
2
Apesar de o mtodo insert retornar o id do registro que foi criado, este registro est
apenas na memria e ainda no foi inserido no banco de dados fsico. Para executar
a insero, precisamos explicitamente executar o mtodo commit e caso queiramos
desfazer esta ao, utilizamos o mtodo rollback.
1. >>> banco.commit() # dados inseridos no banco SQLite
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
41
Consultando os registros
Existem duas formas de consultar todos os registros de uma tabela **SELECT *
FROM **
Utilizando base.tabela.ALL
1.
2.
3.
4.
5.
6.
7.
8.
9.
DAL._lastsql retorna o ltimo comando SQL executado pela DAL
Utilizando uma query
Deste modo, o operador id>0 poderia ser substitudo, utilizando os operadores (==,
!=, <, >, <=, >=, like, belongs).
Neste caso, o comando SQL seria: 'SELECT carros.id, carros.marca,
carros.modelo FROM carros WHERE carros.id>0;'
Query
Para facilitar, voc pode armazenar a referncia para uma tabela em uma varivel.
1. >>> carros = banco.carros
Voc pode tambm definir uma query utilizando os operadores (==, !=, <, >, <=, >=,
like, belongs) e armazenar esta query em uma varivel:
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
42
Quando voc invoca o banco de dados com uma query, voc define um conjunto de
registros, que tambm pode ser armazenado em uma varivel:
1. >>> conjunto = banco(query)
O comando anterior apenas define o conjunto de dados que ser retornado, porm,
ainda no executa a query no banco de dados. Para executar esta query,
necessrio chamar explicitamente:
1.
2.
3.
4.
5.
6.
7.
8.
O cdigo SQL que foi executado acima : "SELECT carros.id, carros.marca,
carros.modelo FROM carros WHERE carros.marca<>'Toyota';"
Atalhos
Seria o mesmo que:
1. >>> meuregistro = banco(banco.carros.id==1).select().first()
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
43
Ordenao
Query mltipla
Podemos utilizar mais de um argumento como filtro de uma query. Para isso,
podemos utilizar | (ou) e & (e)
1.
2.
3.
4.
Contagem de registros
Alterao de registros
Para alterar um registro existente no banco de dados, podemos usar:
1.
2.
3.
4.
5.
6.
7.
8.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
44
Tipos de dados
'string')
'text')
'password')
'blob')
'upload')
'boolean')
'integer')
'double')
'time')
'date')
'datetime')
db.referenced_table) # reference field
list:string)
Atributos
Cada campo pode receber os seguintes atributos de acordo com o seu tipo de dado:
http://www.temporealeventos.com.br ]
45
Migraes
Validadores
Os validadores de formulrio
IS_ALPHANUMERIC
Este validador checa se um campo contm um caractere dentro do range a-z, A-Z
ou 0-9
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
46
IS_DATE
Este validador checa se o campo contm uma data vlida, de acordo com o formato
especificado
1.
2. requires = IS_DATE(format='%Y-%m-%d',
3.
error_message='O formato deve ser AAAA-MM-DD')
IS_DATE_IN_RANGE()
Funciona da mesma maneira que o IS_DATE, mas permite especificar um range de
datas
1. requires = IS_DATE_IN_RANGE(format='%Y-%m-%d',
2.
minimum=datetime.date(2008,1,1),
3.
maximum=datetime.date(2009,12,31),
4.
error_message='O formato deve ser AAAA-MM-DD'
5.
)
IS_IN_SET
Checa se o valor est contido em um conjunto (set):
1. requires = IS_IN_SET(['a', 'b', 'c'],
2.
zero='escolha um valor',
3.
error_message='o valor deve ser a, b ou c'
4.
)
IS_LENGHT
Verifica se o valor respeita o tamanho mnimo e mximo especificados.
Os argumentos so:
maxsize: O tamanho mximo permitido
minsize: O tamanho mnimo permitido
Exemplo: checa se o texto menor do que 10 caracteres:
1. INPUT(_type='text', _name='marca', requires=IS_LENGHT(9))
IS_LOWER
Este validador nunca retorna um erro, ele apenas converte o valor inserido para
texto em minsculo.
1. requires = IS_LOWER()
IS_NOT_EMPTY
Verifica se o valor do campo no est vazio.
1. requires = IS_NOT_EMPTY(error_message='No pode ser vazio')
IS_URL
Verifica se o valor respeita a sintaxe de uma URL vlida.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
47
requires
requires
requires
requires
requires
=
=
=
=
=
IS_URL()
IS_URL(mode='generic')
IS_URL(allowed_schemes=['https'])
IS_URL(prepend_scheme='https')
IS_URL(mode='generic',
allowed_schemes=['ftps', 'https'],
prepend_scheme='https')
IS_IMAGE
Em um campo de upload checa se o formato do arquivo uma imagem vlida.
Podemos tambm especificar as dimenses mnima e mxima para o arquivo.
1. requires = IS_IMAGE(extensions=('jpeg', 'png'), maxsize(200, 200), minsize(50, 50))
IS_EMPTY_OR
Se voc precisar que um campo aceite um valor vazio e ainda assim quiser efetuar
outras validaes, por exemplo, em um campo que tem que ser uma data ou estar
vazio:
1. requires = IS_EMPTY_OR(IS_DATE())
IS_NOT_IN_DB
Considere o seguinte exemplo:
1. banco.define_table('pessoa', Field('nome'))
2. banco.pessoa.nome.requires = IS_NOT_IN_DB(banco, 'pessoa.nome')
Quando voc tentar inserir uma nova pessoa, ser validado se o nome j no existe
no banco de dados banco, no campo pessoa.nome. Como os outros validadores,
esta checagem feita no nvel do formulrio, portanto, aconselhvel utilizar
sempre em conjunto com o validador unique que atua no banco de dados.
1. banco.define_table('pessoa', Field('nome', unique=True))
2. banco.pessoa.nome.requires = IS_NOT_IN_DB(banco, 'pessoa.nome')
IS_IN_DB
o IS_IN_DB funciona da mesma forma que o anterior, porm checa se o valor existe
na tabela.
notnull
O validador notnull atua na camada do banco de dados, e traduzido para o cdigo
SQL NOT NULL, no permitindo que o campo referido seja de valor nulo.
1. banco.define_table('pessoa', Field('nome', notnull=True))
2. banco.pessoa.nome.requires = IS_NOT_IN_DB(banco, 'pessoa.nome')
lenght
lenght define o tamanho de um campo do tipo texto:
1. banco.define_table('pessoa', Field('nome', lenght=55))
2. banco.pessoa.nome.requires = IS_NOT_IN_DB(banco, 'pessoa.nome')
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
48
default
default define o valor padro para o campo quando um valor no for definido:
1. banco.define_table('pessoa', Field('nome', default='annimo'))
2. banco.pessoa.nome.requires = IS_NOT_IN_DB(banco, 'pessoa.nome')
widgets
limitby instrui o widget a mostrar no mais do que cinco sugestes por vez,
e minlength define que deve ser digitado um nmero mnimo de caracteres para
que a consulta Ajax seja executada.
E no controller:
1. def index():
2.
form=SQLFORM(db.carros)
3.
return dict(form=form)
Resultado:
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
49
Appadmin
Para cada aplicao criada, o web2py prov um controlador chamado appadmin.
Este controlador tem como objetivo auxiliar na administrao dos bancos de dados
da aplicao.
O controlador appdamin acessvel atravs da URL:
http://127.0.0.1:8000/<suaapp>/appadmin/index
Atravs deste controlador possvel:
Visualizar a lista de tabelas definidas
Executar queries da DAL
Executar operaes CRUD nos registros do banco de dados (Inserir,
Selecionar, Atualizar, Apagar)
Exportar o contedo de uma tabela
Importar contedo para uma tabela
Lista de bancos de dados e tabelas definidas
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
50
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
51
Log SQL
A aplicao admin armazena o log de todo o cdigo SQL executado pela DAL.
http://127.0.0.1:8000/admin/default/peek/<suaapp>/databases/sql.log
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
timestamp: 2010-08-14T18:12:01.902993
CREATE TABLE auth_event(
id INTEGER PRIMARY KEY AUTOINCREMENT,
time_stamp TIMESTAMP,
client_ip CHAR(512),
user_id INTEGER REFERENCES auth_user(id) ON DELETE CASCADE,
origin CHAR(512),
description TEXT
);
success!
timestamp: 2010-08-14T18:12:01.913395
CREATE TABLE marcas(
id INTEGER PRIMARY KEY AUTOINCREMENT,
marca CHAR(512) NOT NULL UNIQUE
);
success!
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
52
O Projeto
Loja de Carro
Requisitos
Vendedor
Incluir um novo veculo
Alterar um veculo existente
Remover um veculo
Consultar compradores
Consultar mensagens enviadas pelo site
Comprador
Pesquisar um veculo
Visualizar detalhes do veculo
Informar interesse de compra por um veculo
Entrar em contato com a loja
A aplicao
Na interface administrativa do web2py crie uma nova aplicao
chamada lojadecarro. Vamos utilizar a aplicao de modelo do web2py como base
para este desenvolvimento.
Layout
O cliente tambm forneceu uma idia de como ele deseja que seja o layout da
aplicao, desta forma, ficar mais fcil entender os requisitos.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
53
Pgina Home:
Pgina de detalhes
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
54
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
55
arquivo 0.py
# coding: utf8
db = DAL('sqlite://storage.sqlite')
e_m = {
'empty':'Este campo obrigatrio',
'in_db':'Este registro j existe no banco de dados',
'not_in_db':'Este registro no existe no banco de dados',
'email':'Voc precisa inserir um e-mail vlido',
'image':'O arquivo precisa ser uma imagem vlida',
'not_in_set':'Voc precisa escolher um valor vlido',
'not_in_range':'Digite um nmero entre %(min)s e %(max)s',
}
config = dict(nmsite='Loja de Carro',dscsite='S os melhores carros')
estados = ('Novo','Usado')
cores = ('Azul','Amarelo','Verde','Vermelho','Prata','Branco','Preto','Vinho')
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
56
arquivo carros.py
# coding: utf8
# criamos um validador pr definido
notempty=IS_NOT_EMPTY(error_message=e_m['empty'])
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
57
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
58
Exercicio:
Analisando a definio de layout, os requisitos e o modelo de dados. Forme
uma dupla e desenvolva o restante da aplicao Loja de Carro. Com a ajuda
do instrutor crie os controllers e as views para cada uma das pginas
apresentadas no layout.
No se preocupe com design, layout e as barras laterais da aplicao,
desenvolva apenas o contedo principal.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
59
Mapeamento de URLs
Controladores so a porta de entrada de uma aplicao web2py. Quando um
usurio efetua uma requisio (request) no navegador, o web2py ir mapear esta
requisio de acordo com o esquema de mapeamento de URLs definido no
framework. Este esquema de mapeamento j vem por padro definido da seguinte
maneira:
http://www.temporealeventos.com.br ]
60
Caso a funo f no exista, o web2py redirecionar para a funo index. Caso c.py no exista, o web2py
redirecionar para o controlador default e caso a no exista, o web2py redirecionar para a
aplicao init e welcome respectivamente. Se nenhuma dessas condies forem satisfeitas, ento a
mensagem invalid request ser exibida.
Por padro, a cada nova requisio tambm sero criadas variveis de sesso.
Adicionalmente, um cookie referente a esta sesso ser enviado ao browser do
cliente para manter referncia a esta sesso.
A extenso html opcional e, mesmo que voc no informe, o web2py ir assumir
que voc quer o retorno no formato html. A extenso em uma requisio determina a
extenso da view correspondente que ir renderizar o retorno da funof(). E este
mesmo contedo poderia ser servido em mltiplos formatos (html, xml, json, rss
etc.).
Funes que recebem argumentos ou que iniciam com duplo underline __ no so expostas publicamente
e podem ser acessadas apenas atravs de outras funes. Esta pode ser uma boa prtica de acoplamento
(boxing).
Passagem de parmetros
O web2py mapeia os parmetros POST e GET da seguinte maneira:
http://127.0.0.1:8000/a/c/f.html/x/y/z?p=1&q=2
Para a funo f do controlador c.py na aplicao a, os parmetros de URL so
armazenados no objeto request seguindo a seguinte estrutura:
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
61
Nos exemplos acima, tanto request.args[i] como request.args(i) podem ser utilizados para acessar o
elemento do objeto request.args, porm, enquanto o primeiro estoura uma exceo caso a lista no
possua o ndice especificado, o ltimo retorna None neste caso.
1. request.url
O web2py valida toda URL para prevenir ataques. As URLs podem conter apenas caracteres
alfanumricos, underlines, barras, traos; os argumentos no podem conter pontos consecutivos. Todo
espao em branco substitudo por um underline.
Checagem de cookies
Criao do ambiente em que ser executada a funo requisitada
Inicializao dos objetos request, response, cache
Abre uma sesso existente ou inicia uma nova sesso
Executa em ordem alfabtica todos os arquivos de modelo da aplicao
Executa a funo requisitada
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
62
API
Modelos, Vises e Controladores so executados em um ambiente onde so
importados e ficam disponveis os seguintes objetos:
Objetos globais:
request, response, session, cache
Navegao:
redirect, HTTP
internacionalizao (i18n):
T
Validadores:
CLEANUP, CRYPT, IS_ALPHANUMERIC, IS_DATE_IN_RANGE,
IS_DATE, IS_DATETIME_IN_RANGE, IS_DATETIME,
IS_DECIMAL_IN_RANGE, IS_EMAIL, IS_EMPTY_OR, IS_EXPR,
IS_FLOAT_IN_RANGE, IS_IMAGE, IS_IN_DB, IS_IN_SET, IS_INT_IN_RANGE,
IS_IPV4, IS_LENGTH, IS_LIST_OF, IS_LOWER, IS_MATCH, IS_EQUAL_TO,
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
63
Banco de dados:
DAL, Field
Outros objetos e mdulos so definidos nas bibliotecas, mas eles no so
automaticamente importados at que sejam utilizados.
As principais entidades da API no ambiente de execuo web2py so: request,
response, session, cache, URL, HTTP, redirect e T.
Alguns objetos e funes, incluindo Auth (autenticao), Crud (formulrios)
e Service (webservices), so definidos no mdulo gluon/tools.py e necessitam
serem importados caso sejam necessrios.
1. from gluon.tools import Auth, Crud, Service
Renderizao de contedo
Como j foi discutido anteriormente, o web2py mapeia as funes Python (as aes)
definidas nos controladores como sendo a porta de entrada para a requisio. Caso
esta funo retorne um dicionrio de dados, o web2py ento renderiza a viso
correspondente com a funo+extenso.
Caso o controlador retorne um objeto string, por exemplo, isto tambm ser
renderizado em uma view, pois strings podem ser serializadas como dicionrio, e
este exemplo serve para qualquer outro objeto com esta caracterstica: um
dicionrio ou pode ser serializado como um.
Podemos criar vises especficas para cada ao, podemos utilizar uma nica viso
para renderizar contedo de vrias aes e tambm podemos ter varias vises que
renderizam contedo de uma nica ao.
Caso o web2py no encontre uma viso especifica para renderizar o contedo de
uma ao, ento ele renderizar utizando as vises genricas; por padro temos
uma view genrica para cada um dos seguintes tipos de contedo:
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
64
Agora faa um request em outra aba ou janela do seu navegador para o endereo
da funo (ao) aluno
http://127.0.0.1:8080/<suaapp>/default/aluno
Mesmo no informando a extenso, o web2py assume o padro e renderiza o
contedo em formato HTML. Experimente agora:
http://127.0.0.1:8080/<suaapp>/default/aluno.html
http://127.0.0.1:8080/<suaapp>/default/aluno.xml
http://127.0.0.1:8080/<suaapp>/default/aluno.load
http://127.0.0.1:8080/<suaapp>/default/aluno.json
Como RSS contm um formato fixo, o retorno de um controlador em formato RSS
precisa obedecer seguinte estrutura:
1. def feed():
2.
return dict(title="meu rss",
3.
link="http://feed.minhaapp.com",
4.
description="meu primeiro feed com web2py",
5.
entries=[
6.
dict(title="web2py framework",
7.
link="http://feed.minhaapp.com/web2py",
8.
description="meu primeiro item - Python Show!")
9.
])
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
65
Agora acesse:
http://127.0.0.1:8080/<suaapp>/default/feed.html
http://127.0.0.1:8080/<suaapp>/default/feed.xml
http://127.0.0.1:8080/<suaapp>/default/feed.json
http://127.0.0.1:8080/<suaapp>/default/feed.load
http://127.0.0.1:8080/<suaapp>/default/feed.rss
Alm das formas explanadas aqui, tambm possvel renderizar contedo atravs
de servios (web-services), que podem ser SOA, SOAP, XML-RPC, REST, etc.,
porm, este assunto ser abordado no mdulo avanado deste treinamento.
response
Outra maneira de enviar contedo para a viso utilizando a funo write do objeto
response, que tem por objetivo escrever direta e intrusivamente no corpo do html
retornado.
Altere a ao aluno
1. def aluno():
2.
response.write('escrito diretamente pelo response')
3.
agora = request.now
4.
return dict(nome='SeuNome', curso='web2py', idade=27, dia=agora.date(),
hora=agora.time())
acesse:
http://127.0.0.1:8080/<suaapp>/default/aluno.load
e repare que o response.write escreveu contedo no corpo da viso, e que este
contedo escrito antes de ser efetuado o retorno do dicionrio.
Mtodos e propriedades do objeto response
response.write pode receber qualquer objeto string ou que possa ser serializado
como string.
O objeto response um container transportador de respostas; o web2py
implementa em seu layout padro o objeto response como container para algumas
informaes importantes que so renderizadas no <HEAD> do HTML:
response.cookies: responsvel pelo envio de cookies.
response.download(request, db): mtodo implementado para a criao da
funcionalidade de download de arquivos.
response.files: uma lista de arquivos CSS e JS que sero includos no header do
layout padro. Para incluir um arquivo CSS ou JS apenas inclua um novo objeto a
esta lista. Ele resolver o problema de duplicidade. A ordem importante.
response.flash: objeto opcional para armazenar uma mensagem de status a ser
exibida nas vises.
response.headers: dicionrio para cabealhos HTTP.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
66
response.menu: parmetro opcional para ser usado pelo Helper MENU para a
criao de menus.
response.meta: um dicionrio contendo as informaes de META, geralmente
utilizado em otimizao para busca (SEO), como por exemplo response.meta.author,
response.meta.description, e/ou response.meta.keywords. O contedo de META
automaticamente includo no local da tag META do html, e o arquivo
"web2py_ajax.html" que responsvel por esta incluso.
response.render(view, vars): um mtodo utilizado para invocar diretamente uma
viso atravs de um controlador.
response.stream(file, chunk_size): quando um controlador retorna este tipo de
objeto, o web2py efetua o stream deste arquivo em blocos de 1MB.
response.title: opcional. Deve conter o ttulo da pgina a ser renderizado pela tag
HTML <title> no header de uma viso.
response._vars: acessvel apenas pela viso, e contm o retorno do controlador
para a viso.
response.view: o nome da viso a ser renderizada por padro naquele controlador.
response.write(text): escreve textos no corpo <body> da viso renderizada.
No existem restries quanto ao uso de response para a passagem de
parmetros. Voc pode criar novos itens no dicionrio response, mas
recomendado manter apenas os seguintes:
1.
2.
3.
4.
5.
6.
7.
8.
response.title
response.subtitle
response.flash
response.menu
response.meta.author
response.meta.description
response.meta.keywords
response.meta.*
Session
Session um dicionrio que armazena valores que ficam disponveis em todo o
escopo da aplicao; como a sesso iniciada antes da execuo dos modelos, o
acesso a este objeto global.
A sintaxe simples:
1.
2.
3.
4.
5.
6.
7.
#definio
session.minhavariavel = 'valor'
#acesso
a = session.minhavariavel
ou
a = session['minhavariavel']
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
67
Redirecionamento
O redirecionamento de url feito atravs da funo redirect, que pode ser chamada
em qualquer modelo, controlador ou viso.
1. redirect('http://www.web2pybrasil.com.br')
O cdigo acima faz com que o web2py invoque uma exceo HTTP que efetua o
output deste redirecionamento para o navegador, quebrando o fluxo normal do
cdigo no momento em que chamada.
URL
Uma das funes mais importantes no web2py a funo URL. Ela gera uma URL
que pode ser mapeada dinamicamente para aes dos controladores e arquivos
estticos.
Por exemplo:
1. URL('aluno')
Note que a sada da funo URL neste caso depende dinamicamente do nome da
aplicao que est sendo executada, do controller que foi invocado e dos
parmetros que tenham sido recebidos.
Por exemplo:
1. URL('aluno', args=['x','y'], vars=dict(z='t'))
Desta forma:
1. URL(a='minhaapp', c='default', f='aluno')
Ser:
1. /minhaapp/default/aluno
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
68
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
69
Autenticao
Para utilizar o sistema RBAC, os usurios precisam estar identificados. Isso significa
que eles precisam se registrar (ou serem registrados) para fazer o login.
Auth prov mltiplas formas de login. A padro consiste em uma identificao
baseada na tabela auth_user. Como alternativa, voc pode autenticar seus usurios
utilizando servios de terceiros ou provedores de autenticao como, por exemplo,
Google, PAM, LDAP, FaceBook, LinkedIn, OpenID, Oauth etc.
Para comear a utilizar Auth, voc precisa definir no nvel do model o seguinte
cdigo:
Note que este trecho de cdigo j est definido na aplicao welcome, que serve de template para novas
aplicaes no web2py.
1. form gluon.tools import Auth
2. auth = Auth(globals(), db)
3. auth.define_tables(username=False)
{{extend 'layout.html'}}
<h2>{{=request.args(0)}}</h2>
{{=form}}
{{if request.args(0)=='login':}}
<a href="{{=URL(args='register')}}" >register</a><br />
<a href="{{=URL(args='request_reset_password')}}" >lost password</a><br />
{{pass}}
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
70
http://www.temporealeventos.com.br ]
71
Restringindo acesso
Para restringir acesso a uma funo, permitindo apenas que usurios logados a
acessem, utilizamos o decorador @auth.requires_login()
1. @auth.requires_login():
2. def segredo():
3.
return dict(message='Bem vindo %(first_name)s' % auth.user)
4.
auth.user um dicionrio contendo uma cpia dos registros de db.auth_user para o usurio que est
atualmente logado. H tambm o auth.user_id, que armazena o mesmo auth.user.id que armazena
apenas o id do usurio.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
72
Quando um novo usurio fizer login no web2py atravs de um destes servios, sero
criados os registros necessrios para que este usurio seja uma entidade do Auth e
seu e-mail ficar armazenado na tabela db.auth_user. O web2py armazenar
um registration_id baseado na identidade utilizada, para garantir que este usurio
um registro nico.
Voc pode customizar o mapeamendo de dados fornecidos pelo jainrain.com com os
dados de sua tabela de usuriosauth_user. Exemplo para o Facebook:
1. auth.settings.login_form.mappings.Facebook = lambda profile:\
2.
dict(registration_id = profile["identifier"],
3.
username = profile["preferredUsername"],
4.
email = profile["email"],
5.
first_name = profile["name"]["givenName"],
6.
last_name = profile["name"]["familyName"])
Autorizao
Usurios pertencem a grupos. Cada grupo possui uma identificao. Grupos
possuem permisses. Usurios possuem permisses herdadas dos grupos aos
quais pertencem.
Voc pode criar grupos, incluir usurios e permisses via appadmin:
Considerando que possumos um grupo chamado RH (Funcionrios do depto de
RH), podemos checar se o usurio logado atualmente possui associao a este
grupo e desta maneira controlar o acesso a aes.
Decoradores
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
73
def acao_publica():
return 'essa funo pblica'
@auth.requires_login()
def acao_protegida():
return 'esta funo requer que o usurio esteja logado'
@auth.requires_membership('RH')
def acao_protegida_porgrupo():
return 'esta funo requer que o usurio logado seja membro do grupo RH'
@auth.requires(auth.user_id==1 or request.client=='127.0.0.1')
def acao_protegida_por_condicao():
return 'esta funo requer que o usurio tenha o id 1 e o IP 127.0.0.1'
Note que todas as funes, exceto a primeira, possuem restries baseadas no login
do usurio. Caso o usurio no esteja logado e as permisses no possam ser
checadas, o web2py redireciona o usurio para a pgina de login.
Se um usurio logado no possuir a permisso de acesso a uma determinada ao,
o web2py redireciona para uma pgina que pode ser configurada em models com:
1. auth.settings.on_failed_authorization = \
2.
URL('acao_a_direcionar')
http://www.temporealeventos.com.br ]
74
Tudo o que est entre {{...}} ser executado como cdigo Python. Alm disso, o
web2py especifica algumas palavras-chave para ajudar no processo de criao de
views. So elas:
escopo e parmetros
Como as views so executadas em um ambiente paralelo ao ambiente de execuo
dos controllers, elas no tm acesso ao que definido nas funes, ao menos que
sejam variveis de sesso ou o prprio retorno de uma funo.
Mas as views tm acesso a todo o restante do escopo da aplicao, portanto
qualquer funo, objeto ou varivel definidos nos models ficaro acessveis para
todas as views.
Desta mesma forma, o web2py j implementa alguns mtodos prprios que podem
ser utilizados tanto nas views, quanto nos controllers.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
75
HTML Helpers
Considere o seguinte cdigo em uma view:
1. {{=DIV('isto', '', 'um', 'teste', _id='123', _class='minhaclasse')}}
DIV, por exemplo, uma classe helper, um tipo de classe que pode ser usada para
criar HTML programaticamente.
Em uma classe helper, os argumentos so interpretados como objetos contidos
dentro da tag HTML. Os argumentos nomeados que iniciam com um underline sero
interpretados como atributos. Alguns helpers recebem argumentos nomeados que
no iniciam com underline; estes argumentos so especficos para cada tipo de
TAG.
TAGS
A, B, BEAUTIFY, BODY, BR, CENTER, CODE, DIV, EM, EMBED, FIELDSET,
FORM, H1, H2, H3, H4, H5, H6,
HEAD, HR, HTML, I, IFRAME, IMG, INPUT, LABEL, LEGEND, LI, LINK, OL, UL,
MARKMIN, MENU, META,
OBJECT, ON, OPTION, P, PRE, SCRIPT, OPTGROUP, SELECT, SPAN, STYLE,
TABLE, TAG, TD, TEXTAREA,
TH, THEAD, TBODY, TFOOT, TITLE, TR, TT, URL, XHTML, XML, xmlescape,
embed64
As tags podem ser agrupadas para gerar cdigos HTML mais complexos:
1. {{=DIV(B(I("hello ", "<world>"))), _class="myclass")}}
renderizado como:
1. <div class="myclass"><b><i>hello <world></i></b></div>
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
76
>>>
>>>
>>>
>>>
<div
XML, por exemplo, um objeto usado para encapsular texto que no deve
ser escapado, ou seja, ser passado diretamente para o navegador. Este texto pode
ou no conter XML vlido, podendo ser cdigo CSS ou Java Script.
1. >>> print DIV("<b>ol</b>")
2. <b>ol</b>
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
77
Formulrios
O HTML helper FORM o responsvel pela criao de formulrios no web2py. Voc
pode utilizar FORM para criar formulrios diretamente na view, ou cri-los
no controller e ento enviar o formulrio como resposta para a view.
O helper FORM apenas cria uma TAG HTML <form>.</form>, e como todos os
outros helpers, possui inteligncia para conhecer os elementos inseridos dentro
dele.
{{extend 'layout.html'}}
<br>
{{=form}}
{{=BEAUTIFY(request.vars)}}
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
78
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
79
Validao de formulrios
Os validadores de formulrio so os mesmos discutidos no capitulo Tipos de dados
e Validaes, porm, no caso dos formulrios, no consideramos os validadores do
nvel do banco de dados.
Alterando nosso primeiro exemplo, podemos incluir a validao em seus campos:
http://www.temporealeventos.com.br ]
80
A view default/index.html:
1.
2.
3.
4.
5.
6.
{{extend 'layout.html'}}
<br>
{{=container}}
{{=BEAUTIFY(request.vars)}}
Em caso de sucesso:
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
81
db = DAL('sqlite://storage.sqlite')
db.define_table('carro',
Field('marca'),
Field('modelo'),
Field('foto','upload'))
db.carro.marca.requires=IS_IN_SET(('Toyota','GM','Volvo', 'Renault'),
error_message='Insira um valor vlido')
db.carro.modelo.requires=IS_NOT_EMPTY(error_message='No pode ser em branco')
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
82
Download
Com o arquivo armazenado na pasta upload da aplicao, podemos exibi-lo
utilizando a funo download que j est definida no controller default.py
1. def download():
2.
return response.download(request, db)
Como o caminho e o nome (que gerado randomicamente para o arquivo que foi
enviado) so armazenados na varivel request.vars.image, podemos us-la para
gerar a visualizao desta imagem.
Vamos criar uma nova ao que servir para editar os dados de um carro existente
na tabela carro:
1. def mostracarro():
2.
record = db.carro(request.args(0)) or redirect(URL('index'))
3.
form = SQLFORM(db.carro, record, deletable=True,
4.
upload=URL('download'))
5.
if form.accepts(request.vars, session):
6.
response.flash = 'Sucesso'
7.
elif form.errors:
8.
response.flash = 'Erros'
9.
return dict(form=form)
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
83
CRUD
Para facilitar ainda mais o trabalho com formulrios, o web2py implementa uma API
para o tratamento dos registros no banco de dados. Esta API oferece os mtodos
CRUD (create, read, update, delete).
importante observar que CRUD diferente de outros mdulos do framework, pois
precisamos importar explicitamente caso queiramos utilizar.
1.
2.
3.
4.
5.
6.
# No arquivo de model
from gluon.tools import Crud
crud = Crud(globals(), db)
# passamos o banco de dados db como parmetro
Funes CRUD
crud.tables() retorna a lista de tabelas do banco de dados.
crud.create(db.tablename) retorna um formulrio para criao de novos
registros.
crud.read(db.tablename, id) retorna um formulrio somente leitura.
crud.update(db.tablename, id) retorna um formulrio de atualizao do
registro (id).
crud.delete(db.tablename, id) exclui o registro (id).
crud.select(db.tablename, query) retorna uma listagem de registros da
tabela.
crud.search(db.tablename) retorna um formulrio de busca.
crud() retorna uma das funes acima baseando-se em request.args().
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
84
http://.../[app]/[controller]/[ao]/tables
app/default/dados/tables
http://.../[app]/[controller]/[ao]/select/[nomedatabela]
app/default/dados/select/carro
http://.../[app]/[controller]/[ao]/read/[nomedatabela]/[id]
app/default/dados/read/carro/1
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
85
JQuery
A aplicao de modelo do web2py welcome j vem com a biblioteca JQuery,
incluindo os plugins JQuery calendar, SuperFish Menus e muitas funes
customizadas baseadas em JQuery.
Voc pode utilizar qualquer outra biblioteca javaScript, como: Prototype, ExtJS,
Mochkit etc.
No layout da aplicao modelo includo um arquivo com vrias funes JS:
1. view/web2py_ajax.html
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
86
O cdigo acima cria uma div que ao ser clicada desaparece lentamente.
Ajax
A funo ajax definida no arquivo web2py_ajax.html uma funo que efetua uma
chamada a uma URL assincronamente. Esta funo sempre retorna uma resposta
que poder ser embutida na sua pgina sem a necessidade de atualizao.
A funo ajax segue a seguinte sintaxe:
1. ajax(url, [id1, id2, ...], target)
Exemplo de implementao:
1. def repetemeunome():
2.
form = FORM(INPUT(_id='nome', _name='nome', _onkeyup="ajax('executacomajax',
3. ['nome'], 'target')"))
4.
target = DIV(_id='target')
5.
return dict(form=form, target=target)
6.
7. def executacomajax():
return str(request.vars.nome +' ') * 10
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
87
web2py na web
Onde encontrar ajuda:
1. Grupo de usurios no google:
a. http://groups.google.com/group/web2py-users-brazil
b. http://groups.google.com/group/web2py
2. Site comunitrio brasileiro:
a. http://www.web2pybrasil.com.br
b. http://web2pybrasil.appspot.com
c. http://twitter.com/web2pybrasil
Onde contribuir:
1. Rede de desenvolvedores voluntrios:
a. http://openhatch.org/+projects/web2py
b. http://web2py.uservoice.com/forums/42577-general
c. http://www.web2pybrasil.com.br
Recursos:
Aplicaes e exemplos:
o http://www.web2pyslices.com
o http://web2py.com/appliances
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
88
Instrutores:
Bruno Cezar Rocha
@rochacbruno
Desenvolvedor e consultor web. Possui mais de 9 anos de experincia em
desenvolvimento web e j trabalhou com as linguagens C, PHP, ASP, C#.
Atualmente, ministra treinamentos, palestras e desenvolve solues com Python
para web com os frameworks Pylons e web2py. um dos colaboradores do site
web2pybrasil, e tambm vezes escreve tambm no blog http://rochacbruno.com.br.
Alm dos projetos com Python, atua como desenvolvedor e coordenador de projetos
(ScrumMaster) na empresa GENTE - http://servicogente.com.br
Contato:
http://twitter.com/rochacbruno - rochacbruno@gmail.com
lvaro Justen
@turicas
Graduando em Eng. de Telecomunicaes pela UFF, onde desenvolve atividades de
pesquisa, ensino e extenso. desenvolvedor da Intelie e ativista de software livre
h mais de 8 anos; colaborador no desenvolvimento do web2py; disseminador do
Arduino e entusiasta de metodologias geis. Participante assduo de eventos e
grupos de usurios, palestra e organiza eventos, como PythOnCampus,
Arduino/web2py Hack Day e Dojorio. Escreve no blog http://blog.justen.eng.br
Contato:
http://twitter.com/turicas - alvarojusten@gmail.com
Desenvolvimento
web
com
Python
e
web2py
by
Bruno
Cezar
Rocha
is
licensed
under
a
Creative
Commons
Attribution-NonCommercial-ShareAlike
License.
Based
on
a
work
at
http://web2py.com
Permissions
beyond
the
scope
of
this
license
may
be
available
at
web2pybrasil.com.br.
[ http://www.web2pybrasil.com.br ,
http://www.temporealeventos.com.br ]
89