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
in_maintance = myconf.get('app.maintance')
Veja como é esse arquivo por padrão
; App configuration
[app]
name = Welcome
author = Your Name <you@example.com>
description = a cool new app
keywords = web2py, python, framework
generator = Web2py Web Framework
; Host configuration
[host]
names = localhost:*, 127.0.0.1:*, *:*, *
; db configuration
[db]
uri = sqlite://storage.sqlite
migrate = true
pool_size = 10 ; ignored for sqlite
; smtp address and credentials
[smtp]
server = smtp.gmail.com:587
sender = you@gmail.com
login = username:password
tls = true
ssl = true
; form styling
[forms]
formstyle = bootstrap3_inline
separator =
Particularmente arquivos .ini são um pouco difíceis de gerenciar, então, é possível usar arquivos .json
Em tradução para .json o que está no arquivo .ini fica assim:
{
"app": {
"building_site":"false",
"maintance":"false",
"template_style": "templates/temp12",
"__status__": "tests",
"privacyterms": "http://google.com.br"
}
,"host": { "names":"localhost:*, 127.0.0.1:*, *:*, *" }
,"db": {
"uri":"sqlite://storage.sqlite"
, "migrate":"true"
, "fake_migrate": "false"
, "migrate_enabled": "true"
, "fake_migrate_all": "false"
, "pool_size":10
}
,"db_session": {
"uri":"sqlite://session.sqlite"
, "migrate":"true"
, "fake_migrate": "false"
, "migrate_enabled": "true"
, "fake_migrate_all": "false"
, "pool_size":10
}
, "forms": { "formstyle":"bootstrap3_inline", "separator" : "" }
, "modules": { "ecommerce": "true", "realstate":"false" }
}
Este é o arquivo que uso em minhas aplicações, ta um pouco grandinho, mas é bem mais legível que o anterior, rs.
Chega de conversa
O que nos interessa para este artigo é saber como separa ambientes certo, então atente para a variável __status__ dentro de app, logo no inicio do arquivo.
Dentro de meu arquivo db.py eu posso controlar esta variável separando diferentes conexões de banco de dados, veja abaixo um exemplo.
db.py
if myconf.get('app.__status__')=='production':
db_session = DAL(myconf.get("db_session.uri"),
pool_size=10,
migrate_enabled=myconf.get('db_session.migrate_enabled'),
fake_migrate=myconf.get('db_session.fake_migrate'),
fake_migrate_all=myconf.get('db_session.fake_migrate_all'),
migrate=myconf.get('db_session.migrate'),
check_reserved=['all']
)
# ---------------------------------------------------------------------
# store sessions and tickets there
# ---------------------------------------------------------------------
session.connect( request, response, db=db_session)
Se estivermos no modo produção as sessões serão armazenadas dentro de um banco de dados, caso não, o framework usará o sistemas de pastas para sessions.
Podemos ainda usar a configuração abaixo.
appconfig.json
{
"app": {
"building_site":"false",
"maintance":"false",
"template_style": "templates/temp12",
"__status__": "tests",
"privacyterms": "http://google.com.br"
}
,"host": { "names":"localhost:*, 127.0.0.1:*, *:*, *" }
,"production": {
,"db": {
"uri":"postgres://user:password@localhost/storage"
, "migrate":"true"
, "fake_migrate": "false"
, "migrate_enabled": "true"
, "fake_migrate_all": "false"
, "pool_size":10
}
,"db_session": {
"uri":"sqlite://session.sqlite"
, "migrate":"true"
, "fake_migrate": "false"
, "migrate_enabled": "true"
, "fake_migrate_all": "false"
, "pool_size":10
}
},
"tests": {
,"db": {
"uri":"sqlite://storage.sqlite"
, "migrate":"true"
, "fake_migrate": "false"
, "migrate_enabled": "true"
, "fake_migrate_all": "false"
, "pool_size":10
}
,"db_session": {
"uri":"sqlite://session.sqlite"
, "migrate":"true"
, "fake_migrate": "false"
, "migrate_enabled": "true"
, "fake_migrate_all": "false"
, "pool_size":10
}
},
}
Repare que criei a chave production e tests e nelas adiciono duas conexões, uma para sessão e outra para a base propriamente dita. Na configuração de produção o banco é um Postgres e para testes SQLite, mantendo as sessões dentro de um banco de dados SQLite
Agora basta fazer um if para tratar isso e ta tudo certo.
Essa dica aí é do Carlos Costa, que postou lá no grupo do telegram, não deixem de comentar e divulgar essa dica.
At+
Comentários
Postar um comentário