Chapter 1: Introdução
Introdução
web2py [web2py] é um framework web de código aberto para desenvolvimento ágil de segurança aplicativos da Web orientados a banco de dados; está escrito em Python [python] e programável em Python. O web2py é um framework completo, o que significa que contém todos os componentes que você precisa para criar aplicativos da Web totalmente funcionais.
O web2py foi projetado para orientar um desenvolvedor da Web a seguir boas práticas de engenharia de software, como o uso de o padrão Model View Controller (MVC). web2py separa a representação de dados (o modelo) da apresentação de dados (a visão) e também da lógica de aplicação e fluxo de trabalho (o controlador). web2py fornece bibliotecas para ajudar o desenvolvedor a projetar, implementar e testar cada uma dessas três partes separadamente, e os faz trabalhar juntos.
O web2py é construído para segurança. Isso significa que ele resolve automaticamente muitos dos problemas Isso pode levar a vulnerabilidades de segurança, seguindo práticas bem estabelecidas. Para exemplo, ele valida todas as entradas (para evitar injeções), escapa todas as saídas (para evitar scripts entre sites), renomeia os arquivos enviados (para evitar ataques de passagem de diretórios). O web2py cuida dos principais problemas de segurança, para que os desenvolvedores tenham menos chances de introduzir vulnerabilidades.
web2py inclui uma Camada de Abstração de Banco de Dados (DAL) que grava SQL [sql-w] dinamicamente para que você, o desenvolvedor, não precise. O DAL sabe como gerar SQL de forma transparente para SQLite [sqlite] , MySQL [mysql] PostgreSQL [postgres] MSSQL [mssql] , FireBird [firebird] Oracle [oracle] , IBM DB2 [db2] , Informix [informix] e Ingres [ingresdb] .
O DAL também pode gerar chamadas de função para o Google Datastore quando executado no Google App Engine (GAE) [gae] . Experimentalmente suportamos mais bancos de dados e novos são constantemente adicionados. Por favor, verifique no site do web2py e lista de discussão para adaptadores mais recentes. Quando uma ou mais tabelas de banco de dados são definidas, o web2py gera automaticamente um banco de dados totalmente funcional baseado na web interface de administração para acessar o banco de dados e as tabelas.
O web2py difere de outros web frameworks, pois é o único framework a adotar totalmente o paradigma Web 2.0., onde a web é o computador. De fato, o web2py não requer instalação ou configuração; isto é executado em qualquer arquitetura que possa executar Python (Windows, Windows CE, Mac OS X, iOS e Unix/Linux), e as fases de desenvolvimento, implantação e manutenção dos aplicativos podem ser feitas por meio de uma interface da Web local ou remota. O web2py é executado com CPython (a implementação de C) e PyPy (Python escrito em Python), no Python 2.7. (Nota do tradutor: A versão 2.16.1 já roda em python3.5+, mas não está completamente testada, não sendo recomendada para produção)
O web2py fornece um sistema de bilhetagem para eventos de erro. Se ocorrer um erro, um ticket é emitido para o usuário, e o erro é registrado para o administrador.
O web2py é open source e liberado sob a licença LGPL versão 3.
Outra característica importante do web2py é que nós, seus desenvolvedores, nos comprometemos a manter compatibilidade retroativa em versões futuras. Fazemos isso desde o primeiro lançamento do web2py em outubro de 2007. Novos recursos foram adicionados e bugs foram corrigidos, mas se um programa funcionou com o web2py 1.0, esse programa funcionará ainda melhor hoje.
Aqui estão alguns exemplos de declarações web2py que ilustram seu poder e simplicidade. O seguinte código:
db.define_table('person', Field('name'), Field('image', 'upload'))
cria uma tabela de banco de dados chamada "person" com dois campos: "name", uma string; e "imagem", algo que precisa ser carregado (a imagem real). Se a tabela já existir, mas não corresponder a essa definição, ela será alterada adequadamente.
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. Isso também valida o formulário enviado, renomeia a imagem enviada de forma segura, armazena a imagem em um arquivo, insere o registro correspondente no banco de dados, impede a dupla apresentaçã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 tags, pesquisa, nuvem de tags, permissões, anexos de mídia e suporte à oembed:
def index(): return auth.wiki()
O seguinte código em vez disso:
@auth.requires_permission('read', 'person')
def f(): ....
impede que visitantes acessem a função f
a menos que o visitante seja um membro de um grupo cujos membros tenham permissões para "ler" registros da tabela "pessoa". Se o visitante não estiver logado, o visitante será direcionado para uma página de login (fornecida por padrão pelo web2py).
O web2py também suporta componentes, ou seja, ações que podem ser carregadas em uma visualização e interagir com o visitante via Ajax sem recarregar a página inteira. Isso é feito através de um LOAD
helper que permite um design muito modular de aplicações; é discutido no capítulo 3 no contexto do wiki e, com algum detalhe, no último capítulo deste livro.
Esta 6ª edição do livro descreve web2py
2.4.1 e versões posteriores.
Princípios
A programação em Python geralmente segue esses princípios básicos:
- Não se repita (DRY).
- Deve haver apenas uma maneira de fazer as coisas.
- Explícito é melhor que implícito.
O web2py abraça totalmente os dois primeiros princípios, forçando o desenvolvedor a usar o software de som práticas de engenharia que desencorajam a repetição de código. O web2py guia o desenvolvedor por quase todas as tarefas comuns no desenvolvimento de aplicativos da Web (criação e processamento de formulários, gerenciamento sessões, cookies, erros, etc.).
web2py difere de outros frameworks em relação ao terceiro princípio, que às vezes conflitua com os outros dois. Em particular, o web2py não importa aplicativos do usuário, mas os executa em um contexto pré-definido. Esse contexto expõe as palavras-chave do Python, bem como as palavras-chave web2py.
Para alguns, isso pode parecer mágico, mas não deveria. Simplesmente, na prática, alguns módulos já são importados sem que você faça isso. web2py está tentando evitar a característica irritante de outras estruturas que forçam o desenvolvedor a importar os mesmos módulos no topo de cada modelo e controlador.
O web2py, importando seus próprios módulos, economiza tempo e evita erros, seguindo o espírito de "não se repita" e "deve haver apenas uma maneira de fazer as coisas".
Se o desenvolvedor deseja usar outros módulos Python ou módulos de terceiros, esses módulos devem ser importados explicitamente, como em qualquer outro programa Python.
Estruturas da Web PHP ASP JSP
Em seu nível mais fundamental, um aplicativo da Web consiste em um conjunto de programas (ou funções) executado quando o URL correspondente é visitado. A saída do programa é retornada ao visitante e renderizada pelo navegador.
O objetivo dos frameworks web é permitir que os desenvolvedores criem novos aplicativos de maneira rápida, fácil e sem erros. Isso é feito fornecendo APIs e ferramentas que reduzem e simplificam a quantidade de codificação necessária.
As duas abordagens clássicas para o desenvolvimento de aplicativos da Web são:
O primeiro modelo é o que foi seguido, por exemplo, pelos primeiros scripts CGI. O segundo modelo é seguido, por exemplo, pelo PHP [php] (onde o código está em PHP, uma linguagem semelhante a C), ASP (onde o código está no Visual Basic) e JSP (onde o código está em Java).
Aqui está um exemplo de um programa PHP que, quando executado, recupera dados de um banco de dados e retorna uma página HTML mostrando 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 essa abordagem é que o código é incorporado ao HTML, mas o mesmo código também precisa gerar HTML adicional e gerar instruções SQL para consultar o banco de dados, entrelaçando várias camadas de a aplicação e dificultando a leitura e a manutenção. A situação é pior ainda para os aplicativos Ajax, e a complexidade aumenta 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 pelo HTML
, BODY
e H1
objetos; o banco de dados db
é consultado pelo select
comando; finalmente tudo é serializado em HTML. Notar que db
não é uma palavra-chave, mas uma variável definida pelo usuário. Usaremos esse nome consistentemente para nos referirmos a uma conexão de banco de dados para evitar confusão.
Estruturas da Web são tipicamente categorizadas como um dos dois tipos: Uma estrutura "colada" é construído pela montagem (colagem) de vários componentes de terceiros. Um framework "full-stack" é construído criando componentes projetados especificamente para serem integrados e trabalhar juntos.
O web2py é um framework completo. Quase todos os seus componentes são construídos do zero e são projetados para funcionar juntos, mas funcionam tão bem fora do framework web2py completo. Por exemplo, o A Camada de Abstração de Banco de Dados (DAL) ou a linguagem de modelo pode ser usada independentemente framework web2py importando gluon.dal
ou gluon.template
em seus próprios aplicativos Python. gluon
é o nome do módulo web2py que contém as bibliotecas do sistema. Algumas bibliotecas web2py, como construir e processar formulários de tabelas de banco de dados, ter dependências de outras partes de web2py. O web2py também pode trabalhar com bibliotecas Python de terceiros, incluindo outras linguagens de modelo e DALs, mas eles não serão tão integrados como os componentes originais.
Model-View-Controller
O web2py incentiva o desenvolvedor a separar a representação de dados (o modelo), os dados apresentação (a visão) e o fluxo de trabalho da aplicação (o controlador). Vamos considerar novamente o exemplo anterior e veja como construir um aplicativo web2py em torno dele. Aqui está um exemplo da interface de edição do web2py MVC:
O fluxo de trabalho típico de uma solicitação no web2py é descrito no diagrama a seguir:
No diagrama:
- O servidor pode ser o servidor Web interno da Web2py ou um servidor de terceiros, como o Apache. O servidor lida com multi-threading.
- "main" é o principal aplicativo WSGI. Ele executa todas as tarefas comuns e envolve os aplicativos do usuário. Ele lida com cookies, sessões, transações, roteamento de URL e roteamento reverso e despacho.
Ele pode servir e transmitir arquivos estáticos se o servidor da Web ainda não estiver fazendo isso.
- Os componentes Modelos, Visualizações e Controlador formam o aplicativo do usuário.
- Vários aplicativos podem ser hospedados na mesma instância web2py.
- As setas tracejadas representam a comunicação com o (s) mecanismo (s) de banco de dados. As consultas do banco de dados podem ser gravadas em SQL bruto (desencorajadas) ou usando a camada de abstração do banco de dados web2py (recomendado), para que o código do aplicativo web2py não dependa do mecanismo de banco de dados específico.
- O despachante mapeia o URL solicitado para uma chamada de função no controlador. A saída da função pode ser uma string ou um dicionário de símbolos (uma tabela de hash). Os dados no dicionário são renderizados por uma visualização. Se o visitante solicitar uma página HTML (o padrão), o dicionário será renderizado em uma página HTML. Se o visitante solicitar a mesma página em XML, o web2py tentará encontrar uma visualização que possa renderizar o dicionário em XML. O desenvolvedor pode criar exibições para renderizar 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 agrupadas em uma transação e qualquer exceção não detectada faz com que a transação seja revertida. Se a solicitação for bem-sucedida, a transação será confirmada.
- O web2py também lida com sessões e cookies de sessão automaticamente, e quando uma transação é confirmada, a sessão também é armazenada, a menos que seja especificado de outra forma.
- É possível registrar tarefas recorrentes (via cron) para rodar em horários programados e/ou após a conclusão de determinadas ações. Dessa forma, é possível executar tarefas longas e com uso intensivo de computação em segundo plano sem diminuir a velocidade de navegação.
Aqui está uma aplicação MVC mínima e completa, composta por três arquivos:
"db.py" é o modelo: Um aplicativo web2py muito simples definiria uma conexão com o banco de dados da seguinte forma:
db = DAL('sqlite://storage.sqlite')
db.define_table('contact',
Field('name'),
Field('phone'))
Ele se conecta ao banco de dados (neste exemplo, um banco de dados SQLite armazenado no storage.sqlite
arquivo) e define uma tabela chamada contact
. Se a tabela não existir, o web2py cria e, de forma transparente e no fundo, gera código SQL no dialeto SQL apropriado para o mecanismo de banco de dados específico usado. O desenvolvedor pode ver o SQL gerado, mas não precisa alterar o código se o back-end do banco de dados, cujo padrão é O SQLite é substituído pelo MySQL, PostgreSQL, MSSQL, FireBird, Oracle, DB2, Informix, Interbase, Ingres e Google App Engine (SQL e NoSQL).
Observe que as versões modernas do web2py deixam a conexão de banco de dados específica para um arquivo de texto de configuração armazenado no diretório particular do aplicativo. Isso facilita a implementação do aplicativo de um ambiente de desenvolvimento em um servidor de produção, porque quase certamente existe uma conexão de banco de dados diferente. Então, ao invés de
db = DAL('sqlite://storage.sqlite')
Você verá o código como este:
## app configuration made easy. Look inside private/appconfig.ini
from gluon.contrib.appconfig import AppConfig
## once in production, remove reload=True to gain full speed
myconf = AppConfig(reload=True)
...
db = DAL(myconf.take('db.uri'), pool_size=myconf.take('db.pool_size', cast=int), check_reserved=['all'])
Se você olhar para o arquivo de texto de configuração private/appconfig.ini
você verá que ainda é padronizado como sqlite.
Depois que uma tabela é definida e criada, o web2py também gera um banco de dados totalmente funcional baseado na web interface de administração, chamada appadmin, para acessar o banco de dados e as tabelas.
"default.py" é o controlador:
def contacts():
grid=SQLFORM.grid(db.contact, user_signature=False)
return locals()
No web2py, as URLs são mapeadas para módulos do Python e chamadas de função. Neste caso, o controlador contém uma única função (ou "ação") chamada contacts
. Uma ação pode retornar uma string (a página da web retornada) ou um dicionário Python (um conjunto de key:value
pares) ou o conjunto de variáveis locais (como neste exemplo). Se a função retornar um dicionário, ela será passada para uma exibição com o mesmo nome como o controlador/função, que por sua vez processa a página. Neste exemplo, a função contacts
gera uma grade select/search/create/update/delete para tabela db.contact
e retorna a grade para a exibição.
"default/contacts.html" é a visualização:
{{extend 'layout.html'}}
<h1>Manage My Contacts</h1>
{{=grid}}
Esta visão é chamada automaticamente pelo web2py depois que a função do controlador associado (ação) é executada. O propósito desta visão é renderizar as variáveis no dicionário retornado (no nosso caso grid
) em HTML. O arquivo de visualização é escrito em HTML, mas ele incorpora o código Python delimitado pelo especial {{
e }}
delimitadores. Isso é bem diferente do exemplo de código PHP, porque o único código incorporado no HTML é o código "camada de apresentação". O arquivo "layout.html" referenciado na parte superior do view é fornecida pelo web2py e constitui o layout básico para todos os aplicativos web2py. O arquivo de layout pode facilmente ser modificado ou substituído.
Por que o web2py
O web2py é uma das muitas estruturas de aplicativos da web, mas possui recursos atraentes e exclusivos. O web2py foi originalmente desenvolvido como uma ferramenta de ensino, com as seguintes motivações principais:
- Fácil para os usuários aprenderem o desenvolvimento web do lado do servidor sem comprometer a funcionalidade. Por essa razão, o web2py não requer instalação e configuração, não tem dependências (exceto a distribuição do código-fonte, que requer o Python 2.7 e seus módulos de biblioteca padrão) e expõe a maior parte de sua funcionalidade através de uma interface da Web, incluindo um Ambiente de Desenvolvimento Integrado. com Debugger e interface de banco de dados.
- O web2py permaneceu estável desde o primeiro dia porque segue um design de cima para baixo; ou seja, sua API foi projetada antes de ser implementada. Mesmo que novas funcionalidades tenham sido adicionadas, o web2py nunca quebrou a compatibilidade com versões anteriores, e não quebrará a compatibilidade quando funcionalidades adicionais forem adicionadas no futuro.
- O web2py aborda de forma proativa as questões de segurança mais importantes que afetam muitas aplicações web modernas, conforme determinado pelo OWASP. [owasp] abaixo.
- web2py é leve. Suas principais bibliotecas, incluindo a Camada de Abstração do Banco de Dados, a linguagem de modelos e todos os ajudantes, totalizam 1,4 MB. Todo o código-fonte, incluindo aplicativos de amostra e imagens, é de 10,4 MB.
- O web2py tem uma pegada pequena e é muito rápido. Ele usa o
Rocket
[rocket] Servidor Web WSGI desenvolvido por Timothy Farrell. É tão rápido quanto o Apache com mod_wsgi e suporta SSL e IPv6. - O web2py usa a sintaxe do Python para modelos, controladores e visualizações, mas não importa modelos e controladores (como fazem todos os outros frameworks do Python) - em vez disso, os executa. Isso significa que os aplicativos podem ser instalados, desinstalados e modificados sem precisar reiniciar o servidor da Web (mesmo em produção), e diferentes aplicativos podem coexistir sem que seus módulos interfiram uns com os outros.
O web2py usa uma Camada de Abstração do Banco de Dados (DAL) em vez de um Mapeador Relacional de Objeto (Object Relational Mapper - ORM). De um ponto de vista conceitual, isso significa que diferentes tabelas de banco de dados são mapeadas em diferentes instâncias de um Table
classe e não em classes diferentes, enquanto os registros são mapeados em instâncias de um Row
classe, não em instâncias da classe de tabela correspondente. De um ponto de vista prático, isso significa que a sintaxe SQL mapeia quase um para um na sintaxe DAL, e não há programação de metaclasses complexa acontecendo como nos ORMs populares, o que aumentaria a latência.
WSGI [wsgi-w] [wsgi-o] (Web Server Gateway Interface) é um padrão emergente do Python para comunicação entre um servidor web e aplicativos Python.
Aqui está uma imagem da web2py principal admin interface:
Segurança
O projeto de segurança de aplicativos da Web abertos [owasp] (OWASP) é uma comunidade mundial livre e aberta na melhoria da segurança do software aplicativo.
O OWASP listou os dez principais problemas de segurança que colocam os aplicativos da web em risco. Essa lista é reproduzida aqui, juntamente com uma descrição de como cada problema é abordado pelo web2py:
- cross site scripting"Cross Site Scripting (XSS): falhas XSS ocorrem sempre que um aplicativo pega dados fornecidos pelo usuário e os envia para um navegador sem primeiro validar ou codificar esse conteúdo. O XSS permite que atacantes executem scripts no navegador da vítima que podem seqüestrar sessões de usuários, desfigurar sites, possivelmente introduzir worms, etc. " web2py, por padrão, escapa de todas as variáveis renderizadas na visualização, evitando XSS .
- injection flaws"Falhas de injeção: falhas de injeção, particularmente injeção de SQL, são comuns em aplicativos da Web. A injeção ocorre quando dados fornecidos pelo usuário são enviados a um intérprete como parte de um comando ou consulta. Os dados hostis do invasor enganam o intérprete para executar comandos não intencionais ou alterar dados." O 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, o SQL é gerado dinamicamente pelo DAL, garantindo que todos os dados inseridos sejam escapados adequadamente.
- malicious file execution"Execução de arquivos maliciosos: o código vulnerável à inclusão remota de arquivos (RFI) permite que invasores incluam códigos e dados hostis, resultando em ataques devastadores, como comprometimento total do servidor." web2py permite que apenas funções expostas sejam executadas, impedindo a execução de arquivos maliciosos. Funções importadas nunca são expostas; apenas ações são expostas. O web2py usa 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"Referência direta a objetos inseguros: Uma referência direta a objetos ocorre quando um desenvolvedor expõe uma referência a um objeto interno de implementação, como um arquivo, diretório, registro de banco de dados ou chave, como um URL ou parâmetro de formulário. outros objetos sem autorização. " web2py não expõe nenhum objeto interno; Além disso, o web2py valida todas as URLs, impedindo ataques de passagem de diretórios. O web2py também fornece um mecanismo simples para criar formulários que validam automaticamente todos os valores de entrada.
- CSRF"Cross Web Request Forgery (CSRF): Um ataque CSRF força o navegador de uma vítima conectada a enviar uma solicitação pré-autenticada a um aplicativo Web vulnerável, que então força o navegador da vítima a executar uma ação hostil em benefício do invasor. O CSRF pode ser tão poderoso quanto o aplicativo da web que ele ataca. " O web2py previne o CSRF, bem como a dupla apresentação acidental de formulários, atribuindo um token aleatório único a cada formulário. Além disso, o web2py usa o UUID para o cookie de sessão.
- information leakageimproper error handling"Vazamento de informações e tratamento incorreto de erros: Os aplicativos podem vazar involuntariamente informações sobre sua configuração, funcionamento interno ou violar a privacidade por meio de vários problemas de aplicativo. Os invasores usam essa vulnerabilidade para roubar dados confidenciais ou realizar ataques mais sérios." O web2py inclui um sistema de bilhetagem. Nenhum erro pode resultar no código sendo exposto aos usuários. Todos os erros são registrados e um ticket é emitido para o usuário que permite o rastreamento de erros. Mas erros e código-fonte são acessíveis apenas ao administrador.
- "Autenticação quebrada e gerenciamento de sessão: as credenciais de conta e os tokens de sessão geralmente não são adequadamente protegidos. Os invasores comprometem senhas, chaves ou tokens de autenticação para assumir as identidades de outros usuários." O web2py fornece um mecanismo interno para autenticação do administrador e gerencia as sessões de forma independente para cada aplicativo. A interface administrativa também força o uso de cookies de sessão segura quando o cliente não é "localhost". Para aplicativos, ele inclui uma poderosa API de controle de acesso baseado em função.
- cryptographic store"Armazenamento Criptográfico Inseguro: aplicativos da Web raramente usam funções criptográficas adequadamente para proteger dados e credenciais. Os atacantes usam dados fracamente protegidos para conduzir roubo de identidade e outros crimes, como fraude de cartão de crédito." O web2py usa os algoritmos de hash MD5 ou HMAC + SHA-512 para proteger senhas armazenadas. Outros algoritmos também estão disponíveis.
- secure communications"Comunicações inseguras: os aplicativos frequentemente não criptografam o tráfego da rede quando é necessário proteger as comunicações confidenciais". web2py inclui o SSL ativado [ssl]
Rocket
Servidor WSGI, mas também pode usar o Apache ou o Lighttpd e o mod_ssl para fornecer criptografia SSL de comunicações. - access restriction"Falha ao restringir acesso à URL: Frequentemente, um aplicativo protege apenas funcionalidades confidenciais, impedindo a exibição de links ou URLs a usuários não autorizados. Os invasores podem usar essa fraqueza para acessar e realizar operações não autorizadas, acessando esses URLs diretamente." O web2py mapeia solicitações de URLs para módulos e funções do Python. O web2py fornece um mecanismo para declarar quais funções são públicas e quais requerem autenticação e autorização. A API de controle de acesso baseada em função incluída permite que os desenvolvedores restrinjam o acesso a qualquer função com base em permissões de login, grupo ou grupo. As permissões são muito granulares e podem ser combinadas com filtros de banco de dados para permitir, por exemplo, dar acesso a tabelas e/ou registros específicos. O web2py também permite URLs assinadas digitalmente e fornece API para assinar digitalmente as chamadas de retorno do Ajax. ''
O web2py foi revisado para segurança e você pode encontrar o resultado da revisão na ref. [pythonsecurity] .
Na caixa ('In the box')
Você pode baixar o web2py no site oficial:
http://www.web2py.com
O web2py é composto pelos seguintes componentes:
- bibliotecas: fornece funcionalidade central do web2py e é acessível por meio de programação.
- servidor web: o Servidor Web WSGI
Rocket
. - o aplicativo admin: usado para criar, projetar e gerenciar outros aplicativos web2py. admin fornece um Ambiente de Desenvolvimento Integrado (IDE) completo baseado na Web para a criação de aplicativos web2py. Ele também inclui outras funcionalidades, como testes baseados na web e um shell baseado na web.
- o aplicativo examples: contém documentação e exemplos interativos. exemplos é um clone do site oficial web2py.com e inclui a documentação do epydoc.
- o aplicativo welcome: o modelo básico para qualquer outro aplicativo. Por padrão, ele inclui um menu em cascata CSS puro e autenticação do usuário (discutido no Capítulo 9).
O web2py é distribuído no código-fonte e em formato binário para o Microsoft Windows e para o Mac OS X.
A distribuição do código-fonte pode ser usada em qualquer plataforma em que o Python seja executado e inclua os componentes mencionados acima. Para executar o código fonte, você precisa do Python 2.7 pré-instalado no sistema. Você também precisa de um dos mecanismos de banco de dados suportados instalados. Para aplicações de teste e demanda leve, você pode usar o banco de dados SQLite, incluído no Python 2.7.
As versões binárias do web2py (para Windows e Mac OS X) incluem um interpretador Python 2.7 e o banco de dados SQLite. Tecnicamente, esses dois não são componentes do web2py. Incluindo-os nas distribuições binárias permite que você execute o web2py fora da caixa.
A imagem a seguir mostra a estrutura geral do web2py:
Na parte inferior, encontramos o intérprete. Subindo, encontramos o servidor web (foguete), as bibliotecas e os aplicativos. Cada aplicativo consiste em seu próprio design de MVC (modelos, controladores, visualizações, módulos, idiomas, bancos de dados e arquivos estáticos). Cada aplicativo inclui seu próprio código de administração de banco de dados (appadmin). Cada instância web2py é fornecida com três aplicativos: welcome (o aplicativo scaffolding), admin (o IDE baseado na web) e exemplos (cópia do website e exemplos).
Sobre este livro
Este livro inclui os seguintes capítulos, além desta introdução:
- Capítulo 2 é uma introdução minimalista ao Python. Assume o conhecimento de conceitos de programação processuais e orientados a objetos, como loops, condições, chamadas de função e classes, e aborda a sintaxe básica do Python. Ele também abrange exemplos de módulos do Python que são usados em todo o livro. Se você já conhece o Python, pode pular o Capítulo 2.
- Capítulo 3 mostra como iniciar o web2py, discute a interface administrativa e guia o leitor através de vários exemplos de complexidade crescente: um aplicativo que retorna uma string, um aplicativo de contador, um blog de imagem e um aplicativo wiki completo que permite uploads e comentários de imagens, fornece autenticação, autorização, serviços da Web e um feed RSS. Ao ler este capítulo, você pode precisar consultar o Capítulo 2 para obter uma sintaxe geral do Python e os capítulos a seguir para obter uma referência mais detalhada sobre as funções que são usadas.
- Capítulo 4 Abrange mais sistematicamente a estrutura básica e as bibliotecas: mapeamento de URL, solicitação, resposta, sessões, armazenamento em cache, agendador, cron, internacionalização e fluxo de trabalho geral.
- Capítulo 5 é uma referência para a linguagem de modelos usada para criar exibições. Ele mostra como incorporar código Python em HTML e demonstra o uso de ajudantes (objetos que podem gerar HTML).
- Capítulo 6 cobre a Camada de Abstração do Banco de Dados ou DAL. A sintaxe do DAL é apresentada através de uma série de exemplos.
- Capítulo 7 abrange formulários, validação de formulários e processamento de formulários. FORMULÁRIO é o ajudante de baixo nível para a construção de formulário. O SQLFORM é o construtor de formulários de alto nível. No Capítulo 7, também discutimos a API Create/Read/Update/Delete (CRUD).
- Capítulo 8 abrange recursos de comunicação como recuperar e enviar e-mails e SMSes.
- Capítulo 9 abrange autenticação, autorização e o mecanismo extensível de controle de acesso baseado em função disponível no web2py. A configuração de correio e o CAPTCHA também são discutidos aqui, pois são usados para autenticação. Na terceira edição do livro, adicionamos ampla cobertura de integração com mecanismos de autenticação de terceiros, como OpenID, OAuth, Google, Facebook, LinkedIn etc.
- Capítulo 10 é sobre a criação de serviços da Web no web2py. Oferecemos exemplos de integração com o Google Web Toolkit via pijamas e com o Adobe Flash via PyAMF.
- Capítulo 11 é sobre receitas web2py e jQuery. O web2py é projetado principalmente para a programação do lado do servidor, mas inclui o jQuery, já que descobrimos que ele é a melhor biblioteca JavaScript de código aberto disponível para efeitos e Ajax. Neste capítulo, discutiremos como usar efetivamente o jQuery com o web2py.
- Capítulo 12 discute componentes e plugins web2py como uma forma de construir aplicações modulares. Fornecemos um exemplo de um plug-in que implementa muitas funcionalidades comumente usadas, como gráficos, comentários e marcação.
- Capítulo 13 é sobre a implantação de produção de aplicativos web2py. Discutimos especificamente a implantação em um servidor da Web LAMP (que consideramos a principal alternativa de implantação). Discutimos servidores web alternativos e configuração do banco de dados PostgreSQL. Discutimos a execução como um serviço em um ambiente Microsoft Windows e a implantação em algumas plataformas específicas, incluindo o Google Applications Engine, o Heroku e o PythonAnywhere. Neste 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, geocodificação, paginação, a API do Twitter e muito mais.
- Capítulo 15 tem informações sobre como ajudar e contribuir com o projeto, com tópicos como fazer relatórios de bugs e contribuir com mudanças no código.
Este livro aborda apenas as funcionalidades básicas do web2py e a API que acompanha o web2py. Este livro não abrange dispositivos web2py (por exemplo, aplicativos prontos).
Você pode baixar os dispositivos web2py do site correspondente [appliances] .
Você pode encontrar tópicos adicionais discutidos no grupo de usuários [usergroup] . Há também AlterEgo [alterego] , o antigo web2py blog e FAQ.
Este livro foi escrito usando a sintaxe MARKMIN (veja Capítulo 5 ) e convertido automaticamente para HTML, LaTeX e PDF.
Apoio, suporte
O principal canal de suporte é o grupo de usuários [usergroup] , com dezenas de posts todos os dias. Mesmo se você é um novato, não hesite em perguntar - teremos prazer em ajudá-lo. Há também um sistema formal de acompanhamento de problemas em https://github.com/web2py/web2py/issues. Por último, mas não menos importante, você pode ter suporte profissional (consulte o site para obter detalhes).
Contribuir
Qualquer ajuda é muito apreciada. Você pode ajudar outros usuários no grupo de usuários ou enviar diretamente patches no programa (no site do GitHub https://github.com/web2py/web2py). Mesmo se você encontrar um erro de digitação neste livro, ou melhorá-lo, a melhor maneira de ajudar é corrigindo o próprio livro (que está sob a pasta de origem do repositório). em https://github.com/mdipierro/web2py-book). Para mais informações sobre contribuição, consulte Capítulo 15 .
Elementos de estilo
PEP8 [style] contém boas práticas de estilo ao programar com o Python. Você encontrará que o web2py nem sempre segue essas regras. Isto não é por causa de omissões ou negligência; é nosso crença de que os usuários do web2py devem seguir essas regras e nós o incentivamos. Nós escolhemos não seguir algumas dessas regras ao definir objetos auxiliares web2py para minimizar a probabilidade de conflito de nomes com objetos definidos pelo usuário.
Por exemplo, a classe que representa um <div>
é chamado DIV
, enquanto de acordo com o Referência de estilo Python deveria ter sido chamado Div
. Acreditamos que, para este exemplo específico, usar um "DIV" todo em letras maiúsculas é uma escolha mais natural. Além disso, essa abordagem deixa os programadores livre para criar uma classe chamada "Div", se optar por fazê-lo. Nossa sintaxe também é mapeada naturalmente para a notação DOM da maioria dos navegadores (incluindo, por exemplo, o Firefox).
De acordo com o guia de estilo do Python, todas as cadeias maiúsculas devem ser usadas para constantes e não variáveis. Continuando com o nosso exemplo, mesmo considerando que DIV
é uma aula é uma classe especial que nunca deve ser modificada por o usuário porque isso quebraria outros aplicativos web2py. Por isso, acreditamos que isso qualifica a DIV
classe como algo que deve ser tratado como uma constante, justificando ainda mais nossa escolha de notação.
Em resumo, as seguintes convenções são seguidas:
- Os ajudantes e validadores de HTML são todos maiúsculos pelas razões discutidas acima (por
DIV
,A
,FORM
,URL
). - O objeto do tradutor
T
é maiúscula, apesar do fato de que é uma instância de uma classe e não uma classe em si. Logicamente, o objeto do tradutor executa uma ação semelhante aos auxiliares de HTML e afeta a parte de renderização da apresentação. Além disso,T
precisa ser fácil de localizar no código e deve ter um nome curto. - As 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 que seguimos, tanto quanto possível, o Guia de Estilo Python (PEP8). Por exemplo, todos os objetos de instância são letras minúsculas (solicitação, resposta, sessão, cache) e todas as classes internas são capitalizadas.
Em todos os exemplos deste livro, as palavras-chave web2py são exibidas em negrito, enquanto as strings e comentários são mostrados em itálico.
Licença
O web2py está licenciado sob a licença LGPL versão 3. O texto completo da licença está disponível na ref. [lgpl3] .
De acordo com a LGPL, você pode:
- redistribuir o web2py com seus aplicativos (incluindo versões binárias oficiais do web2py)
- libere seus aplicativos que usam bibliotecas web2py oficiais sob qualquer licença que você desejar
No entanto, você deve:
- deixar claro na documentação que seu aplicativo usa web2py
- liberar qualquer modificação das bibliotecas web2py sob a licença LGPLv3
A licença inclui o aviso de isenção usual:
NÃO HÁ NENHUMA GARANTIA PARA O PROGRAMA, NA EXTENSÃO PERMITIDA PELA LEGISLAÇÃO APLICÁVEL. EXCETO QUANDO, DE OUTRA FORMA, FORMADO POR ESCRITO OS TITULARES DOS DIREITOS DE AUTOR E/OU OUTRAS PARTES FORNECER O PROGRAMA “TAL COMO ESTÁ”, SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS IMPLÍCITAS DE COMERCIALIZAÇÃO E ADEQUAÇÃO PARA UM PROPÓSITO ESPECÍFICO. TODO O RISCO QUANTO À QUALIDADE E DESEMPENHO DO O PROGRAMA ESTÁ COM VOCÊ. SE O PROGRAMA SE PROVOCAR DEFEITO, VOCÊ ASSUME O CUSTO DE TODOS SERVIÇO NECESSÁRIO, REPARO OU CORREÇÃO.
EM HIPÓTESE ALGUMA, A MENOS QUE EXIGIDO PELAS LEIS APLICÁVEIS OU ACORDADO POR ESCRITO, NENHUMA TITULAR, OU QUALQUER OUTRA PARTE QUE MODIFICAR E/OU TRANSMITIR O PROGRAMA COMO PERMITIDO ACIMA, SERÁ RESPONSÁVEL POR DANOS, INCLUINDO QUAISQUER DANOS GERAIS, ESPECIAIS, INCIDENTAIS OU CONSEQÜENCIAIS. DANOS DECORRENTES DO USO OU INCAPACIDADE DE USAR O PROGRAMA (INCLUINDO MAS NÃO SE LIMITANDO PERDA DE DADOS OU DADOS QUE TORNAM-SE INCORRECIDOS OU PERDIDOS SUSTENTADOS POR VOCÊ OU TERCEIROS OU FALHA DO PROGRAMA DE OPERAR COM QUALQUER OUTRO PROGRAMA), MESMO QUE ESTE TITULAR OU OUTRO A PARTE FOI ADVERTIDA SOBRE A POSSIBILIDADE DE TAIS DANOS.
Versões recentes
Versões anteriores do web2py, 1.0. * - 1.90. *, Foram lançadas sob a licença GPL2, mais um exceção comercial que, para fins práticos, foi muito semelhante à atual LGPLv3.
Software de terceiros distribuído com o web2py
O web2py contém software de terceiros sob a pasta gluon/contrib/e vários arquivos JavaScript e CSS. Esses arquivos são distribuídos com o web2py sob suas licenças originais, conforme indicado nos arquivos.
Agradecimentos
O web2py foi originalmente desenvolvido por e protegido por Massimo Di Pierro. A primeira versão (1.0) foi lançada em outubro de 2007. Desde então, ela foi adotada por muitos usuários, alguns dos quais também contribuíram com relatórios de bugs, testes, depuração, correções e revisão deste livro.
Alguns dos principais desenvolvedores e colaboradores 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 e 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 e 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. vs. Stockhausen, Hans Donner, Hans Murx, Huaiyu Wang, Ian Reinhart Geiser, Iceberg, Igor Gassko, Igor Moskvitin, 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'Avila, Madhukar R Pai, Manuele Pesenti, Marc Abramowitz, Marcel Hellkamp, Marcel Leuthi, Marcello Della Longa, Margaret Greaney, Maria Mítica, 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 Congelar, 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 Tal, 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, Correndo Calma Ryan Seto, Salomon Derossi, Sam Sheftel, Scott Roberts, Sebastian Ortiz, Sergey Podlesnyi, Sharriff Aina, Simone Bizzotto, Sriram Durbha, Sterling Hankins, Stuart Rackham, Telman Yusupov, Terrence Brannon, 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 que esqueci de alguém, então peço desculpas.
Agradeço particularmente a Anthony, Simone, Richard, Jonathan, Mariano, Bruno, Vladyslav, Martin, Nathan, Thadeus, Tim, Iceberg, Denes, Hans, Christian, Fran e Patrick pelas suas principais contribuições para web2py e Anthony, Alvaro, Brian, Bruno Denes, Dane Denny, Erwin, Felipe, Graham, Jonathan, Hans, Kyle, Mark, Margaret, Michele, Richard, Roberto, Robin, Roman, Scott, Shane, Sharriff, Sriram, Sterling, Stuart, Thadeus, Wen ( e outros) para revisar várias versões deste livro. Sua contribuição foi inestimável. Se você encontrar algum erro neste livro, eles são exclusivamente minha culpa, provavelmente introduzidos por uma edição de última hora. Agradeço também a Ryan Steffen, da Wiley Custom Learning Solutions, pela ajuda na publicação da primeira edição deste livro.
web2py contém código dos seguintes autores, a quem eu gostaria de agradecer:
Guido van Rossum para Python [python] Peter Hunt, Richard Gordon, Timothy Farrell pelo Rocket
[rocket] servidor web, Christopher Dolivet para EditArea [editarea] , Bob Ippolito para simplejson [simplejson] , Simon Cusack e Grant Edwards para pyRTF [pyrtf] , O software científico de Dalke para pyRSS2Gen [pyrss2gen] , Mark Pilgrim for feedparser [feedparser] , Trent Mick para markdown2 [markdown2] , Allan Saddi para fcgi.py, Evan Martin para o módulo memcache do Python [memcache] John Resig para jQuery [jquery] .
Agradeço a Helmut Epp (reitor da DePaul University), David Miller (Reitor do Colégio de Computação e Mídia Digital da DePaul University) e Estia Eichten (Membro da MetaCryption LLC), por sua contínua confiança e apoio.
Por fim, gostaria de agradecer à minha esposa, Claudia, e ao meu filho, Marco, por me aguentarem durante as muitas horas que passei desenvolvendo o web2py, trocando e-mails com usuários e colaboradores e escrevendo este livro. Este livro é dedicado a eles.