Chapter 1: Introdução - TODO

Introdução

web2py[web2py] é um Livre e open-source web framework escrito em Python[python] e programável em Python, para desenvolvimento ágil de aplicações web seguras baseadas em banco de dados. web2py é um framework auto contido, o que significa que ele contém todos os componentes que você precisa para desenvolver completamente aplicações web funcionais.

web2py é projetado para orientar um desenvolvedor web a seguir as boas práticas da engenharia de software, tal como a utilização do padrão Model View Controller (MVC). web2py separa a representação dos dados (the model) da apresentação dos dados (the view) e também da lógica de aplicação e do fluxo de trabalho (the controller). web2py fornece bibliotecas para ajudar a criação, implementação, e teste do projeto, cada uma dessas três partes desenvolvidas separadamente, mas trabalhando em conjunto.

web2py é construído para ser seguro. Isso significa que ele atende automaticamente muitas das questões que podem levar a vulnerabilidades de segurança, seguindo as práticas bem estabelecidas. Por exemplo, web2py valida todas as entradas (para prevenir injections), escapa todas as saídas (para previvir cross-site scripting), renomeia arquivos enviados (para prevenir ataques de atravessamento de diretórios). web2py cuida das principais questões de segurança, para que os desenvolvedores tenham menos chances de encontrar vulnerabilidades.

web2py inclui uma camada de abstração de banco de dados (DAL) que escreve código SQL[sql-w] dinamicamente para que você, o desenvolvedor, não o faça. A DAL sabe como gerar código SQL de forma transparente para SQLite[sqlite], MySQL[mysql], PostgreSQL[postgres], MSSQL[mssql], FireBird[firebird], Oracle[oracle], IBM DB2[db2], Informix[informix], Ingres[ingresdb], e MongoDB[mongodb]. A DAL também pode gerar chamadas de função para o Google Datastore quando estiver rodando no Google App Engine (GAE)[gae]. Experimentalmente suportamos mais bancos de dados e os novos são constantemente adicionados. Por favor verifique no site web2py e na lista de discussão para descobrir adaptadores mais recentes. Uma vez que uma ou mais tabelas do banco de dados estão definidos, web2py gera automaticamente uma interface de administração web-based para acessar os bancos de dados e as tabelas.

web2py diferente dos outros web frameworks in that é o único a adotar totalmente o paradigma Web 2.0, onde a web é o computador. De fato, web2py não exige instalação ou configuração; ele funciona em qualquer arquitetura que aceita Python (Unix/Linux, Windows, Windows CE, Mac OS X, e iOS), e tanto o desenvolvimento, quanto a produção, e manutenção da aplicação pode ser feita por uma interface web local ou remota. web2py é executado com CPython (a implementação em C) e PyPy (Python escrito em Python), nas versões 2.5, 2.6, e 2.7, embora "oficialmente" ele só suporta 2.5, para que possamos garantir a compatibilidade com versões anteriores para as aplicações.

web2py fornece um sistema de ticketing para eventuais erros. Se um erro ocorrer, um ticket é emitido para o usuário, e o erro é registrado para o administrador.

web2py é open source e licenciado sob a versão 3 da licença LGPL.

Outra importante característica do web2py é que nós, os desenvolvedores, desejamos manter a compatibilidade com versões anteriores. Isto é feito desde a primeira versão do web2py em outubro de 2007. Novas funcionalidades foram adicionadas e bugs foram corrigidos, mas se um programa trabalhou com web2py 1.0, esse programa vai funcionar ainda melhor hoje.

Aqui estão alguns exemplos de declarações web2py que ilustram o seu poder e simplicidade. O seguinte código:

db.define_table('person', Field('name'), Field('image', 'upload'))

cria uma tabela de banco de dados chamado "pessoa" com dois campos: "Nome", uma string, e "imagem", algo que precisa ser enviado (a imagem real). Se a tabela já existe, mas não corresponde a essa definição, é alterada de forma adequada.

Dada a tabela definida acima, o seguinte código:

form = SQLFORM(db.person).process()

cria um formulário de inserção para esta tabela que permite aos usuários fazer upload de imagens. também valida um formulário submetido, renomeia a imagem carregada de uma forma segura, armazena a imagem em um arquivo, insere o registro correspondente no banco de dados, previne a dupla submissão, e eventualmente, modifica o próprio formulário, adicionando mensagens de erro se os dados enviados pelo usuário não passarem na validação.

Este código incorpora um wiki totalmente funcional com as tags, pesquisa, tag cloud, permissões, anexos de mídia e suporte oEmbed:

def index(): return auth.wiki()

O código a seguir em vez disso:

@auth.requires_permission('read','person')
def f(): ....

evita que os visitantes acessem a função f a menos que o visitante é um membro de um grupo cujos membros têm permissão para ler "read" os registros da tabela pessoa "person". Se o visitante não está logado, ele é direcionado para uma página de login (fornecido por padrão pelo web2py).

web2py também suporta componentes, ou seja, ações que podem ser carregados em uma view e interagir com o visitante através de Ajax sem re-carregar a página inteira. Isto é feito através de um LOAD helper que permite um design muito modular de aplicações, que é discutida no capítulo 3, no contexto da wiki e, com algum detalhe, no último capítulo deste livro.

Princípios

Programação em Python normalmente segue esses princípios básicos:

  • Não se repita - Don't repeat yourself (DRY).
  • Deve haver apenas uma maneira de fazer as coisas.
  • Explicito é melhor que implicito.

web2py abrange totalmente os dois primeiros princípios, forçando o desenvolvedor a usar o software de boas práticas de engenharia que desestimulam a repetição de código. web2py orienta o desenvolvedor através de quase todas as tarefas comuns no desenvolvimento de aplicações web (criação e processamento de formulários, gerenciando sessões, cookies, erros, etc.)

request

web2py difere de outros frameworks no que diz respeito ao terceiro princípio, que por vezes conflita com as outras duas. Em particular, web2py não importar aplicativos do usuário, mas executa-los em um contexto pré-definido. This context exposes the Python keywords, as well as the web2py keywords.

Para alguns isso pode parecer mágica, mas não deveria. Simplesmente, na prática, alguns módulos já estão importados sem ter que fazer isso. web2py está tentando evitar a característica irritante de outros frameworks que forçam o desenvolvedor para importar os mesmos módulos no topo de cada modelo e controlador.

web2py, através da importação de seus próprios módulos, economiza tempo e evita erros, seguindo, assim, o espírito de "não repetir-se" e " deve haver apenas uma forma de fazer as coisas".

Se o desenvolvedor deseja usar outros módulos Python ou módulos de terceiros, os módulos devem ser importados explicitamente, como em qualquer outro programa Python.

Web frameworks

PHP
ASP
JSP

Em seu nível mais fundamental, uma aplicação web é composto de um conjunto de programas (ou funções) que são executadas quando o URL correspondente é visitado. A saída do programa é retornada para o visitante e transmitido pelo browser.

O objetivo de frameworks web é permitir que desenvolvedores criem novos aplicativos de forma rápida, fácil e sem erros. Isso é feito por fornecimento de APIs e ferramentas que reduzem e simplificam a quantidade de codificação que é necessária.

As duas abordagens clássicas para o desenvolvimento de aplicações web são:

  • Geração de HTML[html-w] [html-o] programaticamente.
  • Incorporação de código em páginas HTML.

O primeiro modelo é o que foi seguido, por exemplo, pelos primeiros scripts CGI. O segundo modelo é seguido, por exemplo por, PHP php : citar (onde o código é em PHP, uma linguagem C-like), ASP (onde o código é em Visual Basic), e JSP (onde o código é em Java).

Aqui é um exemplo de um programa para que, quando executado, recupera dados de um banco de dados e retorna uma página HTML que mostra os registros selecionados:

<html><body><h1>Records</h1><?
  mysql_connect(localhost,username,password);
  @mysql_select_db(database) or die( "Unable to select database");
  $query="SELECT * FROM contacts";
  $result=mysql_query($query);
  mysql_close();
  $i=0;
  while ($i < mysql_numrows($result)) {
    $name=mysql_result($result,$i,"name");
    $phone=mysql_result($result,$i,"phone");
    echo "<b>$name</b><br>Phone:$phone<br /><br /><hr /><br />";
    $i++;
  }
?></body></html>

O problema com esta abordagem é que o código está incorporado em HTML, mas o mesmo código também precisa gerar HTML adicional e gerar instruções SQL para consultar o banco de dados, emaranhando várias camadas dea aplicação e tornando difícil de ler e manter. A situação é ainda pior para aplicações Ajax , e a complexidade cresce com o número de páginas (arquivos) que compõem a aplicação.

A funcionalidade do exemplo acima pode ser expressa em web2py com duas linhas de código Python:

def index():
    return HTML(BODY(H1('Records'), db().select(db.contacts.ALL)))

Neste exemplo simples, a estrutura da página HTML é representada programaticamente a HTML, CORPO e H1 objetos. O banco de dados db é consultado pelo comando select, finalmente, tudo é serializado em HTML. Note que db não é uma palavra, mas uma variável definida pelo usuário. Vamos usar esse nome consistentemente para se referir a uma conexão de banco de dados para evitar confusão.

Frameworks web são geralmente classificados como um dos dois tipos: Um framework "glued" é construído pela montagem (colando) diversos componentes de terceiros. Um framework "full-stack" é construído através da criação de componentes projetados especificamente para serem totalmente integrados e trabalharem juntos.

web2py é um framework full-stack. Quase todos os seus componentes são construídos a partir do zero e são projetados para trabalhar juntos, mas eles funcionam igualmente bem fora da estrutura completa web2py. Por exemplo, a camada de abstração de banco de dados (DAL) ou a linguagem de template podem ser usados independente do web2py framework,importando gluon.dal ou gluon.template em seus próprios aplicativos Python. gluon é o nome do módulo que contém o web2py bibliotecas do sistema. Algumas bibliotecas web2py, como a construção e processamento de formulários a partir de tabelas de banco de dados, tem dependências em outras partes do web2py. web2py também pode trabalhar com bibliotecas Python de terceiros, incluindo outras linguagens de template e Dals, mas eles não serão tão bem integrados como os componentes originais.

Model-View-Controller

Model-View-Controller

web2py incentiva o desenvolvedor a representação de dados em separado (model), os dados apresentação (view) e o fluxo de trabalho do aplicativo (controller). Vamos considerar novamente o exemplo anterior e veja como construir uma aplicação web2py em torno dele. Aqui está um exemplo da interface de edição MVC web2py:

image

O fluxo de trabalho típico de um request web2py é descrito no diagrama seguinte:

image

No diagrama:

  • O servidor pode ser o servidor web embutido no web2py ou um servidor de terceiros, como o Apache. O servidor lida com multi-threading.
  • "main" é a principal aplicação WSGI. Ele executa todas as tarefas comuns e envolve aplicativos do usuário. Trata-se de cookies, sessões, transações, encaminhamento e roteamento de URL, e expedição reversa.

Ela pode servir e transmitir arquivos estáticos se o servidor web já não está fazendo isso.

  • Os componentes Models, Views e Controller compõe a aplicação do usuário.
  • Múltiplas aplicações podem ser hospedadas na mesma instância de web2py.
  • As setas a tracejado representam a comunicação com o(s) mecanismo(s) de banco de dados. As consultas de banco de dados podem ser escritos em SQL puro (desencorajado) ou usando o web2py camada de abstração de banco de dados (recomendado), de modo que o código do aplicativo web2py não é dependente do mecanismo banco de dados específico.
  • O dispatcher mapeia a URL solicitada para uma chamada de função no controller. A saída da função pode ser uma string ou um dicionário de símbolos (uma tabela hash). Os dados do dicionário são renderizados por uma view. Se o visitante solicita uma página HTML (o padrão), o dicionário é renderizado em uma página HTML. Se o visitante solicita a mesma página em XML, web2py tenta encontrar uma visão que pode renderizar o dicionário em XML. O desenvolvedor pode criar visões para processar páginas em qualquer um dos protocolos já suportados (HTML, XML, JSON, RSS, CSV e RTF) ou em protocolos personalizados adicionais.
  • Todas as chamadas são envolvidas em uma transação, e qualquer exceção não tratada faz com que a transação seja revertida. Se o pedido for bem sucedida, a transação é confirmada.
  • web2py também lida com sessões e cookies de sessão automaticamente, e quando a transação for confirmada, a sessão também é armazenada, a menos que especificado o contrário.
  • É possível registrar tarefas recorrentes (via cron) para ser executado em horários programados e / ou após a conclusão de determinadas ações. Desta forma é possível realizar tarefas longas e intensas em segundo plano sem reduzir a velocidade da navegação.

Aqui esta um aplicativo MVC mínimo e completo, que consiste em três arquivos:

"db.py" este é o model:

db = DAL('sqlite://storage.sqlite')
db.define_table('contact',
   Field('name'),
   Field('phone'))

Ele se conecta ao banco de dados (Neste exemplo uma SQLite database armazenada no arquivo storage.sqlite) e define uma tabela chamada contact. Se a tablela não existe, web2py irá cria-la, transparentimente e em plano de fundo, gerar código SQL no dialeto SQL específico para o mecanismo de base de dados usado. O desenvolvedor pode o ver o código SQL gerado, mas não precisa alterar o código se o back-end de banco de dados, cujo padrão é SQLite, for substituído por MySQL, PostgreSQL, MSSQL, FireBird, Oracle, DB2, Informix, Interbase, Ingres, e Google App Engine (SQL e NoSQL).

Uma vez que a tabela é definida e criada, web2py também gera uma interface totalmente funcional baseada na Web de administração de banco de dados, chamada ** AppAdmin , para acessar o banco de dados e as tabelas.

"default.py" este é o controller:

def contacts():
    grid=SQLFORM.grid(db.contact, user_signature=False)
    return locals()

Em web2py, URLs são mapeadas para módulos Python e chamadas de função. Neste caso, o controller contem uma única função (ou "action") chamada contacts. Uma action pode retornar uma string (a página da web) ou um dicionário Python (um conjunto de pares key:value ) ou um conjunto de variáveis locais (como no exemplo). Se a função retornar um dicionário, ele é passado para a view com o mesmo nome do controller / função, que por sua vez processa a página. Nesse exemplo, a função contacts gera uma grid que permite select/search/create/update/delete na tabela db.contact e retorna esse grid para a view.

"default/contacts.html" esta é a view:**

{{extend 'layout.html'}}
<h1>Manage My Contacts</h1>
{{=grid}}

Esta view é chamado automaticamente pelo web2py após a função de controller associada (ação) é executado. O objetivo dessa view é renderizar as variáveis ​​no dicionário retornado (no nosso caso grid) em HTML. O arquivo de view é escrito em HTML, mas ele incorpora código Python delimitado por {{ e }}. Isto é muito diferente do exemplo do código de PHP, porque o único código embutido no HTML é o código da "camada de apresentação". O arquivo "layout.html" referenciado no topo da view é fornecido pelo web2py e constitui o layout básico para todas as aplicações web2py. O arquivo de layout pode facilmente ser modificado ou substituído.

Por que web2py?

web2py é um dos muitos frameworks de desenvolvimento web, mas tem recursos interessantes e únicos. web2py foi originalmente desenvolvido como uma ferramenta de ensino, com as seguintes motivações primárias:

  • Fácil para os usuários que estão aprendendo desenvolvimento web server-side sem comprometer funcionalidades. Por essa razão web2py não necessita de instalação ou configuração, não possui dependências (exceto pelo próprio código fonte , que requer Python 2.5 e seus módulos da biblioteca padrão), e expõe a maior parte de sua funcionalidade através de uma interface Web, incluindo um ambiente de desenvolvimento integrado com Debugger e interface de banco de dados.
  • web2py tem se mantido estável desde o primeiro dia, pois segue um projeto top-down; i.e., ou seja, a sua API foi projetada antes de ser implementada. Mesmo depois de novas funcionalidades serem adicionadas, web2py nunca quebrou a compatibilidade, e não vai quebrar a compatibilidade quando uma funcionalidade adicional for adicionada no futuro.
  • web2py proativamente aborda as questões de segurança mais importantes que afligem muitas aplicações web modernas,conforme determinado pelo OWASP[owasp].
  • web2py é leve. Suas bibliotecas centrais, incluindo a camada de abstração de banco de dados, a linguagem de template, e toda a quantidade de helpers tem apenas 1.4MB. O código-fonte inteiro, incluindo aplicações de exemplo e imagens equivale a 10,4 MB.
  • web2py ocupa pouco espaço e é muito rápido. Ele usa o Rocket[rocket] Servidor web WSGI desenvolvido por Timothy Farrell. Ele é tão rápido quanto o Apache com mod_wsgi, e suporta SSL e IPv6.
  • web2py utiliza sintaxe Python para models, controllers e views, mas não importa models e controllers (como todos os outros frameworks Python fazem) - em vez disso os executa. Isso significa que os aplicativos podem ser instalados, desinstalados, e modificado sem a necessidade de reiniciar o servidor web (mesmo em produção), e os diferentes aplicativos podem coexistir sem seus módulos interferindo uns com os outros.
  • web2py usa a Database Abstraction Layer (DAL) ao em vez da Object Relational Mapper (ORM). Do ponto de vista conceitual, isso significa que as diferentes tabelas de banco de dados são mapeados em diferentes instâncias de uma classe Table e não em diferentes classes, enquanto que os registros são mapeados em instâncias de uma classe Row, não em instâncias da classe tabela correspondente. De um ponto de vista prático, significa que a sintaxe SQL é mapeada quase em um-para-um na sintaxe DAL, e não há nenhuma programação metaclass complexa acontecendo sob o capô como nos ORMs populares, que gostaria de acrescentar latência.

WSGI [wsgi-w] [wsgi-o] (Web Server Gateway Interface) é um padrão de Python criado para a comunicação entre um servidor web e aplicações Python.

Aqui está uma imagem da interface principal do web2py admin:

image

Segurança

security

O Open Web Application Security Project[owasp] (OWASP) é uma comunidade mundial livre e de código aberto focado em melhorar a segurança de aplicações de software.

OWASP listou os dez principais problemas de segurança que colocam aplicações web em risco. Essa lista é reproduzida aqui, junto com uma descrição de como cada questão é abordada por web2py:

  • cross site scripting
    "Cross Site Scripting (XSS): falhas XSS ocorrem sempre que uma aplicação obtém os dados fornecidos pelo usuário e os envia para um navegador web sem primeiro validar ou codificar esse conteúdo. XSS permite que atacantes executar scripts no navegador da vítima, que pode sequestrar sessões de usuários, desfigurar sites, possivelmente introduzir worms, etc." web2py, por padrão, escapa todas as variáveis renderizadas na view, prevenindo XSS.
  • injection flaws
    "Injection Flaws: Injection flaws, injeções de SQL particularmente, são comuns em aplicações web. Injections ocorre quando os dados fornecidos pelo usuário são enviados para um intérprete, como parte de um comando ou consulta. O atacante usa truques hostis para o intérprete executar comandos indesejados ou alterar dados." web2py inclui uma camada de abstração de banco de dados que torna a injeção de SQL impossível. Normalmente, as instruções SQL não são escritas pelo desenvolvedor. Em vez disso, SQL é gerado dinamicamente pelo DAL, garantindo que todos os dados inseridos estão devidamente escapados.
  • malicious file execution
    "Malicious File Execution: Código vulnerável à inclusão de arquivos remotos (RFI) permite a atacantes incluir dados e código hostil, resultando em ataques devastadores, como comprometer servidores totalmente." web2py permite apenas funções expostas a serem executados, impedindo a execução de arquivos maliciosos. Funções importadas nunca são expostas, apenas ações estão expostas. web2py utiliza uma interface de administração baseada na Web que torna muito fácil acompanhar o que está exposto e o que não está.
  • insecure object reference
    "Insecure Direct Object Reference: A referência direta à objeto ocorre quando um desenvolvedor expõe uma referência a um objeto de implementação interna, como um arquivo, diretório, registro de dados, ou chave, como um parâmetro de URL ou formulário. Os atacantes podem manipular estas referências para acessar outros objetos sem autorização." web2py não expõe quaisquer objetos internos; Além disso, web2py valida todas as URLs, evitando assim ataques de atravessamento de diretórios. web2py também fornece um mecanismo simples para criar formulários que validam automaticamente todos os valores de entrada.
  • CSRF
    "Cross Site Request Forgery (CSRF): Um ataque CSRF força a iniciar sessão no navegador da vítima para enviar um pedido de pré-autenticação para uma aplicação web vulnerável, o que, em seguida, força o navegador da vítima a executar uma ação maliciosa em prol do atacante. CSRF pode ser tão poderoso quanto a aplicação Web que ele ataca." web2py evita CSRF, bem como acidental duplo envio de formulários através da atribuição de um sinal aleatório de uma só vez a cada formulário. Além disso web2py utiliza o UUID para o cookie de sessão.
  • information leakage
    improper error handling
    "Information Leakage e Improper Error Handling: Os aplicativos podem não intencionalmente vazar informações sobre sua configuração, funcionamento interno, ou violar a privacidade através de uma variedade de problemas de aplicação. Os atacantes se aproveitam dessa fraqueza para roubar dados sensíveis ou conduzir ataques mais graves." web2py inclui um sistema de bilhetagem. Nenhum erro pode resultar em exibição de código para os usuários. Todos os erros são registrados e um ticket, que permite o rastreamento de erro, é emitido para o usuário. Mas os erros e o código fonte só podem ser acessados pelo administrador.
  • "Broken Authentication and Session Management: Credenciais da conta e tokens de sessão muitas vezes não são devidamente protegidos. Atacantes comprometem senhas, chaves ou tokens de autenticação para assumir a identidade de outros usuários." web2py fornece um mecanismo built-in para autenticação de administrador e gere sessões de forma independente para cada aplicação. A interface administrativa também obriga o uso de cookies de sessão seguro quando o cliente não é "localhost". Para aplicações, ele inclui uma poderosa API de controle de acesso.
  • cryptographic store
    "Insecure Cryptographic Storage: Aplicações Web raramente utilizam funções criptográficas de forma adequada para proteger os dados e credenciais. Os invasores usam dados protegidos fracamente para realizar o roubo de identidade e outros crimes como fraude de cartão de crédito." web2py utiliza o MD5 ou o HMAC + algoritmos de hash SHA-512 para proteger as senhas armazenadas. Outros algoritmos também estão disponíveis.
  • secure communications
    "Insecure Communications: Aplicações freqüentemente falham em criptografar tráfego de rede quando for necessário para proteger as comunicações sensíveis." web2py inclui o servidor Rocket WSGI que é SSL-enabled[ssl], mas também pode usar o Apache ou Lighttpd e mod_ssl para fornecer criptografia SSL de comunicações.
  • access restriction
    "Failure to Restrict URL Access: Frequentemente uma aplicação só protege funcionalidade sensível ao impedir a exibição de links ou URLs para usuários não autorizados. Os atacantes podem usar esta fragilidade para acessar e realizar operações não autorizadas, acessando as URLs diretamente." web2py mapeia URL request para módulos Python e funções. web2py fornece um mecanismo para declarar quais as funções são públicas e quais exigem autenticação e autorização. A Role Based Access Control API incluída permite aos desenvolvedores restringir o acesso a qualquer função com base no login, membros do grupo ou o grupo de permissões baseadas. As permissões são muito granulares e podem ser combinadas com filtros de dados para permitir, por exemplo, acesso a tabelas específicos e / ou registos. web2py também permite URL assinado digitalmente e fornece API para assinar digitalmente os retornos de chamada do Ajax.

web2py foi revisado para a segurança e você pode encontrar o resultado da análise em ref.[pythonsecurity].

Conteúdo da embalagem

Você pode baixar o web2py do site oficial:

http://www.web2py.com

web2py é composto dos seguintes componentes:

  • libraries: fornecem funcionalidade básica do web2py e and são acessíveis programaticamente.
  • web server: o web server Rocket WSGI.
  • a aplicação admin: usada para criar, desenhar, e gerenciar outras aplicações web2py. admin fornece um Ambiente de Desenvolvimento Integrado (IDE) completo baseado em web para a construção de aplicações web2py. Também inclui outras funcionalidades, tais como testes e um shell baseados em web.
  • a aplicação examples: contém documentação e exemplos interativos. examples é um clone do site oficial we2py.com, e inclui documentação epydoc.
  • a aplicação welcome: o modelo scaffolding base para qualquer outra aplicação. Por padrão inclui um menu CCS puro e autenticação de usuário (discutida no Capítulo 9).

web2py é distribuído em código fonte, e em formato binário para Microsoft Windows e para Mac OS X.

A distribuição de código fonte pode ser em qualquer plataforma onde rode Python e inclui os componentes mencionados acima. Para rodar o código fonte, você precisa do Python 2.5 pré-instalado no sistema. Você também necessita de um dos motores de banco de dados suportados instalado. Para testes e aplicações de baixa demanda, você pode usar o banco de dados SQLite, incluído com o Python 2.5.

As versões binárias do web2py (para Windows e Mac OS X) incluem um interpretador Python 2.5 e o banco de dados SQLite. Tecnicamente, esses dois não são componentes do web2py. Incluí-los nas distribuições binárias permite que você rode o web2py assim que o tira da caixa.

A imagem seguinte The following image retrata a estrutura geral do web2py:

image

Sobre este livro

Este livro inclui os seguintes capítulos, além desta introdução:

  • Capítulo 2 é uma introdução minimalista ao Python. Ele assume o prévio conhecimento de conceitos de programação tanto procedural quanto orientada a objetos tais como laços, condicionais, chamadas a funções e classes, e cobre a sintaxe básica de Python. Ele também cobre exemplos de módulos Python que são utilizados ao longo do livro. Se você já conhece Python, poderá pular para o Capítulo 2.
  • Capítulo 3 mostra como iniciar o web2py, discute a interface administrativa, e guia o leitor pelos vários exemplos de complexidade crescente: uma aplicação que retorna uma string, uma aplicação de contador, um blog de imagens, e uma aplicação wiki completa que permite upload de imagens e comentários, provê autenticação, autorização, web services e um feed RSS. Enquanto lê este capítulo, você pode precisar consultar o Capítulo 2 em busca da sintaxe geral Python e os capítulos seguintes para uma referência mais detalhada sobre as funções usadas.
  • Capítulo 4 cobre mais sistematicamente a estrutura do núcleo e bibliotecas: mapeamento de URL, requisições, respostas, sessões, cache, cron, internacionalização e fluxo de trabalho comum.
  • Capítulo 5 é uma referência para a linguagem de templates usada para construir views. Ele mostra como incorporar código Python dentro de HTML, e demonstra o uso de helpers (objetos que podem gerar HTML).
  • Capítulo 6 cobre a Camada de Abstração de Banco de Dados, ou DAL (Database Abstraction Layer). A sintaxe da DAL é representada através de uma série de exemplos.
  • Capítulo 7 cobre formulários, validação de formulários e processamento de formulários. FORM é um helper de baixo-nível para construção de formulários. SQLFORM é o construtor de alto-nível de formulários. No Capítulo 7 também discutimos a API legada de Criação/Leitura/Atualização/Remoção (CRUD - Create/Read/Update/Delete).
  • Capítulo 8 cobre comunicação com o envio de emails e SMS.
  • Capítulo 9 cobre autenticação, autorização e o mecanismo extensível de Controle de Acesso baseado em Papéis disponível no web2py. Configuração de email e CAPTCHA são discutidos aqui, tendo em vista que são utilizados para autenticação. Na terceira edição do livro temos adicionado extensa cobertura da integração com mecanismos de autenticação de terceiros tais como OpenID, OAuth, Google, Facebook, LinkedIn, etc.
  • Capítulo 10 é sobre criar web services no web2py. Provemos exemplos de integração com o Google Web Toolkit via Pyjamas, e com Adobe Flash via PyAMF.
  • Capítulo 11 é sobre receitas web2py e jQuery. web2py é desenhado principalmente para programação server-side, mas ele também inclui jQuery, desde que temos achado esta como sendo a melhor biblioteca JavaScript open-source disponível para efeitos e Ajax. Nesse capítulo, discutimos como efetivamente utilizar jQuery com web2py.
  • Capítulo 12 discute componentes e plugins web2py como uma maneira de construir aplicações modulares. Fornecemos um exemplo de um plugin que implementa várias funcionalidades comumente utilizadas, tais como construção de gráficos, comentários, tagging, e wiki.
  • Capítulo 13 é sobre deployment de aplicações web2py em abiente de produção. Indicamos principalmente três possíveis cenários de produção: em um servidor Linux ou um conjunto de servidores (o qual consideramos a principal alternativa de deployment), rodando como um serviço em um ambiente Microsoft Windows, e deployment no Google Applications Engine. Nesse capítulo, também discutimos questões de segurança e escalabilidade.
  • Capítulo 14 contém uma variedade de outras receitas para resolver tarefas específicas, incluindo atualizações, geocoding, paginação, a API do Twitter, e mais.

Este livro cobre apenas as funcionalidades básicas do web2py e a API embarcada com web2py. Este livro não cobre appliances web2py (i.e. aplicações prontas).

Você pode baixar appliances web2py do site[appliances] correspondente.

Você pode encontrar tópicos adicionais discutidos no grupo de usuários[usergroup]. Há também AlterEgo[alterego], o antigo blog e FAQ do web2py.

MARKMIN

Este livro foi escrito utilizando a sintaxe markmin e automaticamente convertido para HTML, LaTeX e PDF.

Suporte

O principal canal de suporte é o grupo de usuários[usergroup], com dezenas de postagens todos os dias. Mesmo que você seja um novato, não hesite em perguntar - teremos prazer em te ajudar. Há também um sistema formal de rastreamento de problemas em https://github.com/web2py/web2py/issues . Por último, mas não menos importante, você pode obter suporte profissional (veja o site para detalhes).

Contribua

Qualquer ajuda é realmente apreciada. Você pode ajudar outros usuários no grupo de usuários, ou submetendo patches diretamente no programa (no site do GitHub https://github.com/web2py/web2py). Mesmo que você encontre um erro de digitação neste livro, ou tenha um melhoria para ele, a melhor maneira de ajudar é fazendo patches no próprio livro (o que pode ser feito sob o diretório fonte do repositório em https://github.com/mdipierro/web2py-book).

Elementos de estilo

PEP8 [style] contém boas práticas de estilo ao programar com Python. Você descobrirá que web2py nem sempre segue essas regras. Isso não se deve a omissões ou negligência; é nossa crença que os usuários de web2py devem seguir essas e nós encorajamos isso. Escolhemos não seguir algumas dessas regras quando definimos objetos helper we2py a fim de minimizar a probabilidade de conflito de nome com objetos definidos pelo usuário.

Por exemplo, a classe que representa uma <div> é chamada DIV, enquanto que de acordo com a referência de estilo Python ela deveria chamar-se Div. Acreditamos que, para esse exemplo específico, usar "DIV" em caixa alta seja uma escolha mais natural. Além disso, essa this abordagem deixa os programadores livres para criar uma classe chamada "Div" caso escolham fazê-lo. Nossa sintaxe também mapeia-se naturalmente na notação DOM da maioria dos browsers (inculindo, por exemplo, Firefox).

De acordo com o guia de estilo Python, strings em caixa-alta devem ser usadas para constantes e não para variáveis. Continuando com nosso exemplo, mesmo considerando que DIV é uma classe, esta é uma classe especial que nunca deve ser modificada pelo usuário pois isso poderia danificar outras aplicações web2py. Conseqüentemente, acreditamos que isso qualifica a classe DIV como algo que deva ser tratado como uma constante, justificando posteriormente nossa escolha de notação.

Em resumo, as seguintes convenções são obedecidas:

  • Helpers e validadores HTML são expressos em caixa-alta pelas razões discutidas acima (por exemplo DIV, A, FORM, URL).
  • O objeto tratudor T é expresso em caixa-alta apesar do fato de ser uma instância de uma classe e não a classe em si. Logicamente o objeto tradutor executa uma ação similar aos helpers HTML, ele afeta a parte de renderização da apresentação. Além disso, T precisa se de fácil localização no código e precisa ter um nome curto.
  • Classes DAL seguem o guia de estilo Python (primeira letra maiúscula), por exemplo Table, Field, Query, Row, Rows, etc.

Em todos os outros casos acreditamos ter seguido, sempre que possível, o Guia de Estilo Python (PEP8). Por exemplo todas as instâncias de objetos são expressos em caixa-baixa (request, response, session, cache), e os nomes de todas as classes internas iniciam com letra maiúscula.

Em todos os exeplos deste livro, palavras-chave do web2py keywords são exibidas em negrito, enquanto que strings e comentários são exibidos em itálico.

Licença

license

web2py é licenciado sob a Licença LGPL versão 3. O texto completo da licença está disponível em ref.[lgpl3].

De acordo com a LGPL você pode:

  • redistribuir web2py com seus apps (incluindo as versões binárias oficiais do web2py)
  • lançar suas aplicações que usam bibliotecas oficiais web2py sob qualquer licença que você desejar

Ainda assim você precisa:

  • deixar claro na documentação que sua aplicação usa web2py
  • lançar qualquer modificação das bibliotecas web2py sob a licença LGPLv3

A licença inclui o aviso Legal usual:

NÃO HÁ NENHUMA GARANTIA PARA O PROGRAMA, NA EXTENSÃO PERMITIDA PELA LEI APLICÁVEL. EXCETO QUANDO TUDO INDICADO POR ESCRITO, OS DETENTORES DE DIREITOS AUTORAIS E/OU OUTRAS PARTES FORNECEM O PROGRAMA “COMO ESTÁ” SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO A, GARANTIAS IMPLÍCITAS DE COMERCIALIZAÇÃO E ADEQUAÇÃO PARA UM FIM ESPECÍFICO. TODO O RISCO SOBRE A QUALIDADE E O DESEMPENHO DO PROGRAMA ESTÁ COM VOCÊ. SE O PROGRAMA APRESENTAR DEFEITO, VOCÊ ASSUME O CUSTO DE TODA A MANUTENÇÃO, REPARAÇÃO OU CORREÇÃO NECESSÁRIA.

EM NENHUM CASO, A MENOS QUE EXIGIDO PELA LEI APLICÁVEL OU ACORDADO POR ESCRITO, QUALQUER DETENTOR DE DIREITOS AUTORAIS, OU QUALQUER OUTRA PARTE QUE MODIFICA E/OU TRANSMITE O PROGRAMA COMO PERMITIDO ACIMA, SE RESPONSABILIZARÁ POR DANOS, INCLUINDO QUALQUER DANO GERAL, ESPECIAL, INCIDENTAL OU CONSEQUENCIAL QUE SURGIR DO USO OU INCAPACIDADE DE USAR O PROGRAMA (INCLUINDO, MAS NÃO SE LIMITANDO À PERDA DE DADOS OU DADOS QUE SÃO PRESTADOS IMPRECISAMENTE OU PERDAS SUSTENTADAS POR VOCÊ OU TERCEIROS OU UMA FALHA DO PROGRAMA A OPERAR COM OUTROS PROGRAMAS), MESMO SE TAL DETENTOR OU OUTRA PARTE TENHA SIDO AVISADO DA POSSIBILIDADE DE TAIS DANOS.

Versões anteriores

Versões anteriores de web2py, 1.0.*-1.90.*, foram laçadas sob a licença GPL2 adicionada de uma exceção comercial que, para fins práticos, era muito similar à atual LPGLv3.

Software de terceiros distribuído com web2py

web2py contém software de terceiros sob o diretório gluon/contrib/ e vários arquivos JavaScript e CSS. Essses arquivos são distribuídos com web2py sob suas licenças originais, assim como especificado nos arquivos.

Agradecimentos

web2py foi originalmente desenvolvido e registrado por Massimo Di Pierro. A primeira versão (1.0) foi lançada em Outubro de 2007. Desde então tem sido adotado por vários usuários, alguns dos quais têm contribuído com indicação de bugs, testes, depuração, patches, e com a revisão deste livro.

Alguns dos maiores desenvolvedores e contribuintes são, em ordem alfabética pelo primeiro nome:

Adam Bryzak, Adam Gojdas, Adrian Klaver, Alain Boulch, Alan Etkin, Alec Taylor, Alexandre Andrade, Alexey Nezhdanov, Alvaro Justen, Anand Vaidya, Anatoly Belyakov, Ander Arbelaiz, Anders Roos, Andrew Replogle, Andrew Willimott, Angelo Compagnucci, Angelo and Villas, Annet Vermeer, Anthony Bastardi, Anton Muecki, Antonio Ramos, Arun Rajeevan, Attila Csipa, Ben Goosman, Ben Reinhart, Benjamin, Bernd Rothert, Bill Ferret, Blomqvist, Boris Manojlovic, Branko Vukelic, Brent Zeiben, Brian Cottingham, Brian Harrison, Brian Meredyk, Bruno Rocha, CJ Lazell, Caleb Hattingh, Carlos Galindo, Carlos Hanson, Carsten Haese, Cedric Meyer, Charles Law, Charles Winebrinner, Chris Clark, Chris May, Chris Sanders, Christian Foster Howes, Christopher Smiga, Christopher Steel, Clavin Sim, Cliff Kachinske, Corne Dickens, Craig Younkins, Dan McGee, Dan Ragubba, Dane Wright, Danny Morgan, Daniel Gonz, Daniel Haag, Daniel Lin, Dave Stoll, David Adley, David Harrison, David Lin, David Marko, David Wagner, Denes Lengyel, Diaz Luis, Dirk Krause, Dominic Koenig, Doug Warren, Douglas Philips, Douglas Soares de Andrade, Douglas and Alan, Dustin Bensing, Elcio Ferreira, Eric Vicenti, Erwin Olario, Falko Krause, Farsheed Ashouri, Felipe Meirelles, Flavien Scheurer, Fran Boon, Francisco Gama, Fred Yanowski, Friedrich Weber, Gabriele Alberti, Gergely Kontra, Gergely Peli, Gerley Kontra, Gilson Filho, Glenn Caltech, Graham Dumpleton, Gregory Benjamin, Gustavo Di Pietro, Gyuris Szabolcs, Hamdy Abdel-Badeea, Hans C. v. Stockhausen, Hans Donner, Hans Murx, Huaiyu Wang, Ian Reinhart Geiser, Iceberg, Igor Gassko, Ismael Serratos, Jan Beilicke, Jay Kelkar, Jeff Bauer, Jesus Matrinez, Jim Karsten, Joachim Breitsprecher, Joakim Eriksson, Joe Barnhart, Joel Carrier, Joel Samuelsson, John Heenan, Jon Romero, Jonas Rundberg, Jonathan Benn, Jonathan Lundell, Jose Jachuf, Joseph Piron, Josh Goldfoot, Josh Jaques, José Vicente de Sousa, Jurgis Pralgauskis, Keith Yang, Kenji Hosoda, Kenneth Lundstr, Kirill Spitsin, Kyle Smith, Larry Weinberg, Limodou, Loren McGinnis, Louis DaPrato, Luca De Alfaro, Luca Zachetti, Lucas D'Ávila, Madhukar R Pai, Manuele Presenti, Marc Abramowitz, Marcel Hellkamp, Marcel Leuthi, Marcello Della Longa, Margaret Greaney, Maria Mitica, Mariano Reingart, Marin Prajic, Marin Pranji, Marius van Niekerk, Mark Kirkwood, Mark Larsen, Mark Moore, Markus Gritsch, Mart Senecal, Martin Hufsky, Martin Mulone, Martin Weissenboeck, Mateusz Banach, Mathew Grabau, Mathieu Clabaut, Matt Doiron, Matthew Norris, Michael Fig, Michael Herman, Michael Howden, Michael Jursa, Michael Toomim, Michael Willis, Michele Comitini, Miguel Goncalves, Miguel Lopez, Mike Amy, Mike Dickun, Mike Ellis, Mike Pechkin, Milan Melena, Muhammet Aydin, Napoleon Moreno, Nathan Freeze, Niall Sweeny, Niccolo Polo, Nick Groenke, Nick Vargish, Nico de Groot, Nico Zanferrari, Nicolas Bruxer, Nik Klever, Olaf Ferger, Oliver Dain, Olivier Roch Vilato, Omi Chiba, Ondrej Such, Ont Rif, Oscar Benjamin, Osman Masood, Ovidio Marinho Falcao Neto, Pai, Panos Jee, Paolo Betti, Paolo Caruccio, Paolo Gasparello, Paolo Valleri, Patrick Breitenbach, Pearu Peterson, Peli Gergely, Pete Hunt, Peter Kirchner, Phyo Arkar Lwin, Pierre Thibault, Pieter Muller, Piotr Banasziewicz, Ramjee Ganti, Richard Gordon, Richard Ree, Robert Kooij, Robert Valentak, Roberto Perdomo, Robin Bhattacharyya, Roman Bataev, Ron McOuat, Ross Peoples, Ruijun Luo, Running Calm, Ryan Seto, Salomon Derossi, Sam Sheftel, Scott Roberts, Sergey Podlesnyi, Sharriff Aina, Simone Bizzotto, Sriram Durbha, Sterling Hankins, Stuart Rackham, Telman Yusupov, Thadeus Burgess, Thomas Dallagnese, Tim Farrell, Tim Michelsen, Tim Richardson, Timothy Farrell, Tito Garrido, Tyrone Hattingh, Vasile Ermicioi, Vidul Nikolaev Petrov, Vidul Petrov, Vinicius Assef, Vladimir Donnikov, Vladyslav Kozlovsky, Vladyslav Kozlovskyy, Wang Huaiyu, Wen Gong, Wes James, Will Stevens, Yair Eshel, Yarko Tymciurak, Yoshiyuki Nakamura, Younghyun Jo, Zahariash.

Tenho certeza de que esqueci de alguém, então peço desculpas.

Eu particularmente agradeço a Anthony, Jonathan, Mariano, Bruno, Vladyslav, Martin, Nathan, Simone, Thadeus, Tim, Iceberg, Denes, Hans, Christian, Fran and Patrick por suas maiores contribuições ao web2py e Anthony, Alvaro, Brian, Bruno, Denes, Dane Denny, Erwin, Felipe, Graham, Jonathan, Hans, Kyle, Mark, Margaret, Michele, Nico, Richard, Roberto, Robin, Roman, Scott, Shane, Sharriff, Sriram, Sterling, Stuart, Thadeus, Wen (e outros) revisar várias versões deste livro. Suas contribuições são inestimáveis. Se você encontrar qualquer erro neste livro, a culpa por elas é exclusivamente minha, e foram provavelmente introduzidas numa edição de ultima hora. Também agradeço a Steffen da Wiley Custom Learning Solutions por ajudar com a publicação da primeira edição deste livro.

web2py contém código dos seguintes autores, aos quais eu gostaria de agradecer:

Guido van Rossum por Python[python], Peter Hunt, Richard Gordon, Timothy Farrell pelo servidor web Rocket[rocket] , Christopher Dolivet por EditArea[editarea], Bob Ippolito por simplejson[simplejson], Simon Cusack e Grant Edwards por pyRTF[pyrtf], Dalke Scientific Software por pyRSS2Gen[pyrss2gen], Mark Pilgrim por feedparser[feedparser], Trent Mick por markdown2[markdown2], Allan Saddi por fcgi.py, Evan Martin pelo módulo Python memcache [memcache] , John Resig for jQuery[jquery].

Agradeço a Helmut Epp (reitor da DePaul University), David Miller (Decano da Faculdade de Computação e Mídia Digital da DePaul University), e Estia Eichten (Membro da MetaCryption LLC), por seus contínuos apoio e confiança.

Finalmente, desejo agradecer à minha esposa, Claudia, e meu filho, Marco, por me aguentar durante as muitas horas que passei desenvolvendo o web2py, trocando emails com usuários e colaboradores, e escrevendo este livro. Este livro é dedicado a eles.

 top