Postagens

Mostrando postagens com o rótulo web2py

Limpando a sujeira para fazer backup

 Boas meus caros a dica de hoje vai pra quem precisa fazer backup e está com problema com arquivos pyc. Para quem não sabe o Python é interpretado e compilado, ou seja ele pode ser interpretado diretamente pelo script ou gerar arquivos pré-comprados como  java e linguagens .Net. O processo de interpretação pode possuir várias etapas, mas imagine que você precise falar com um estrangeiro, se você não conhece a língua falada você precisará de um interprete, certo. Uma linguagem de script como o Python pode executar seus scripts diretamente ou criar arquivos bytecodes, que são arquivos pré-compilados (pré-traduzidos), esses bytecodes ajudam o interpretador a ganhar tempo na execução, assim, quando ele executar o código novamente ele não precisará traduzir rotina por rotina novamente, bastando apenas converter o bytecode para a linguagem de máquina. Mas e o web2py? Todos sabemos que o web2py guarda seu código python nativo na pasta modules e é ali que mora o problema quando falamo...

Problemas com migrações

Neste artigo vamos falar sobre migrações no Web2py. Todos sabemos que o W2P faz proezas com a DAL mas as vezes temos alguns percalços no caminho. Para fazer o controle do estado das migrações é criado por padrão na pasta databases alguns arquivos com a extensão '.table'. Esses arquivos são responsáveis por armazenar o estado atual da tabela e logo eles são modificados quando fazemos alterações na definição de tabela no código python. De fato esses arquivos são muito úteis porém há momentos em que eles começam a dar problemas. Primeiro de tudo vamos começar mudando nosso código na função define_table passando um argumento migrate='nome_tabela.table'. db.define_table( 'tabela1' ,     Field( 'nome_campo' ,  'string' ),      migrate = 'tabela1.table' ) Isso fará com que o arquivo .table da tabela1 contenha seu nome, isso facilita evita aqueles arquivos redundantes no diretório. O próximo passo é entender como funcionam as migrações do constru...

Guia de estilos para Python

Bom galera, esse artigo vai ser curto, mas como muitos programadores quem começam no web2py vem de outras linguagens, eles trazem junto os vícios dessas linguagens. Não que seja errado a forma de programar mas cada uma delas estabelece um padrão para facilitar a legibilidade do código. E no python não é diferente. Python foi feito para humanos, então subentende-se que humanos podem ser experts ou não. Imagine você lendo um artigo no jornal escrito da seguinte maneira. CasaBrancaArdeEmChamas Hoje,na   CasaBranca ocorreram         inumeros atentados O presidente,DonaldTrump                 convocou a GuardaNacional Repare que o artigo desrespeita completamente a sintaxe do português e de regras de boa escrita. Imagine se cada um escrevesse código como bem entende. Como python é uma linguagem flexível para solucionar esse problema foi desenvolvido a pep8 ->  https://wiki.python.org.br/GuiaDeEstilo . A p...

Using multiple web2py templates

Okay, today we are going to talk about templates and multiple views on web2py. This tip will be valid for you who want dynamic templates in your app, where you can easily change it whenever you want, passing parameters in the appconfig or something like that. The idea is very basic, you have a repository of templates inside views where you will put your layouts inside, for example temp01, temp02 ... We will also take the opportunity to learn a little more about the web2py (W2P) template engine (TE) called yatl in the new py4web. Come on... The W2P TE allows us to inherit views and inclusions through the reserved words extend and include respectively. But if they are reserved words, aren't they python code? Exactly, extend and include and also block are not python code, so they are executed before any python code in our view. That is, the code below will never work. {{if condition:}} {{extend 'temp01.html'}} {{else:}} {{extend 'temp02.html}} Not even that. {{from gluon.c...

Usando multiplos templates web2py

Muito bem, hoje vamos falar sobre templates e múltiplas visões no web2py. Essa dica irá valer para você que quer templates dinâmicos em seu app, onde você possa alterar facilmente quando quiser, passando um parâmetros no appconfig ou coisa do tipo. A ideia é bem básica, você tem um repositório de templates dentro de views onde você colocará seus layouts dentro, por exemplo temp01, temp02... Vamos aproveitar também para aprender mais um pouco sobre a template engine (TE) do web2py (W2P) chamada de yatl no novo py4web. Vamos lá... O TE do W2P nos permite fazer heranças de visões e inclusões através das palavras reservadas extend e include respectivamente.  Mas se elas são palavras reservadas não são código python? Exatamente, extend e include e também o block não são código python, por isso elas são executadas antes de qualquer código python na nossa view. Ou seja, o código abaixo nunca irá funcionar. {{if condicao:}} {{extend 'temp01.html'}} {{else:}} {{extend 'temp02.html}}...

Como separar ambientes de teste e produção no web2py

Neste artigo falaremos sobre como é fácil separar ambientes no web2py. Para todo trabalho profissional é necessário diferenciar o ambiente de desenvolvimento do de testes e do ambiente de produção. Isso faz com que erros grotescos como corromper os dados, derrubar uma aplicação no meio do seu pico entre outras que custaram seu emprego sejam evitadas. O Web2py não vem por padrão com esta configuração, mas nos deixa disponível um arquivo chamado appconfig.ini dentro da pasta private. Neste arquivo por padrão temos a URI de conexão com banco de dados, email do master do site, padrão de formulários entre outros. Podemos chamar este arquivo de configuração importando o módulo abaixo from  gluon.contrib.appconfig  import  AppConfig myconf = AppConfig( reload = True ) #reload=True recarrega esse arquivo a cada request E acessar uma configuração com in_maintance = myconf.get( 'app.maintance' ) Veja como é esse arquivo por padrão ; App configuration ...

Formulários customizados e Recaptcha

Imagem
Hoje vamos falar sobre captcha e formulários customizados, por algum motivo o web2py não disponibiliza o widget do captcha no form custom. Então vamos mostrar uma solução simples e que lhe permitirá criar seus formulários mais bonitos. Em resumo! Um captcha é um controle de imagem usado para evitar que robos driblem o formulário e consigam enviar dados no formulário. O web2py usa o recaptcha na versão 2 do google, infelizmente se você quiser usar outro recaptcha terá que usar ele diretamente na view. Assunto para outro post. http://web2py.com/books/default/chapter/31/09/access-control#-CAPTCHA-e-reCAPTCHA from gluon.tools import Recaptcha2 auth . settings . captcha = Recaptcha2 ( request , 'PUBLIC_KEY' , 'PRIVATE_KEY' ) Ao habilitar o captcha no auth você verá ele funcionando ao invocar o form na view. user.html {{extend 'layout.html'}}      < div   class = "container-fluid" >        < div   class = "r...

Recursive select with web2py

In this article we will deal with a somewhat well-known but unexplained subject. This tip applies not only to web2py but to anyone who needs to organize their data into tree structures using data from the database.  http://www.web2py.com/books/default/chapter/31/06/data-abstruction-layer#-Recursive-select-s . db.define_table('thing', Field('name'), Field('owner_id', 'reference person')) The web2py documentation proposes the following table structure and how to recursively select this data. person = db.person(id) for thing in person.thing.select(orderby=db.thing.name): print person.name, 'owns', thing.name The fact is that if we do the db (). Select () command it will create a new database connection and so as many times as needed. If we think of a system that receives several visitors per minute (or second), even a table with little data would overload our application. So which one is ideal? ...

Select recursivo web2py

Neste artigo vamos tratar um assunto um tanto conhecido porém pouco explanado. Esta dica vale não somente para web2py mas para qualquer outro que precise organizar seus dados em estruturas de arvore usando dados vindos do banco. http://www.web2py.com/books/default/chapter/31/06/a-camada-de-abstracao-do-banco-de-dados#-Recursivo-select-s db.define_table('thing', Field('name'), Field('owner_id', 'reference person')) A documentação do web2py propõe a seguinte estrutura de tabela e a seguinte forma para fazer um select recursivo nesses dados. person = db.person(id) for thing in person.thing.select(orderby=db.thing.name): print person.name, 'owns', thing.name O fato é que se fizermos o comando db().select() ele irá criar uma nova conexão com o banco de dados e assim quantas vezes for preciso. Se pensarmos em um sistema que recebe vários visitantes por minuto (ou segundo), mesmo uma tabela co...