Após uma série de pedidos para um modelo básico do Flask e do RethinkDB, decidi escrever um post no blog. Esta é a postagem.
BTW:Nós sempre aceitamos pedidos. Se você tem algo sobre o qual gostaria que escrevêssemos ou construíssemos, envie-nos um e-mail.
Hoje vamos criar um simples lista de tarefas, que você poderá modificar para atender às suas próprias necessidades. Antes de começar, sugiro a leitura deste artigo, que detalha como o RethinkDB difere de alguns outros bancos de dados NoSQL.
Configurar o RethinkDB
Instale o RethinkDB
Navegue aqui e baixe o pacote apropriado para o seu sistema. Eu usei Homebrew -
$ brew install rethinkdb
- e levou quase vinte minutos para baixar e instalar a compilação:==> Installing rethinkdb
==> Downloading http://download.rethinkdb.com/dist/rethinkdb- 1.11.2.tgz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/rethinkdb/1.11.2 -- fetch v8 --fetch protobuf
==> make
==> make install-osx
==> Caveats
To have launchd start rethinkdb at login:
ln -sfv /usr/local/opt/rethinkdb/*.plist ~/Library/LaunchAgents
Then to load rethinkdb now:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.rethinkdb.plist
==> Summary
🍺 /usr/local/Cellar/rethinkdb/1.11.2: 174 files, 29M, built in 19.7 minutes
Instale os drivers Python globalmente
$ sudo pip install rethinkdb
Observação: Instalei o Rethink globalmente (fora de um virtualenv), pois provavelmente usarei a mesma versão com vários projetos, com vários idiomas diferentes. Estaremos instalando em um virtualenv posteriormente neste tutorial.
Teste sua configuração
Primeiro, vamos iniciar o servidor com o seguinte comando:
$ rethinkdb
Se tudo estiver instalado corretamente, você deverá ver algo semelhante a:
info: Creating directory /Users/michaelherman/rethinkdb_data
info: Creating a default database for your convenience. (This is because you ran 'rethinkdb' without 'create', 'serve', or '--join', and the directory '/Users/michaelherman/rethinkdb_data' did not already exist.)
info: Running rethinkdb 1.11.2 (CLANG 4.2 (clang-425.0.28))...
info: Running on Darwin 12.4.0 x86_64
info: Loading data from directory /Users/michaelherman/rethinkdb_data
info: Listening for intracluster connections on port 29015
info: Listening for client driver connections on port 28015
info: Listening for administrative HTTP connections on port 8080
info: Listening on addresses: 127.0.0.1, ::1
info: To fully expose RethinkDB on the network, bind to all addresses
info: by running rethinkdb with the `--bind all` command line option.
info: Server ready
Em seguida, teste a conexão. Abra uma nova janela no seu terminal e digite os seguintes comandos:
>>>
$ python
>>> import rethinkdb
>>> rethinkdb.connect('localhost', 28015).repl()
Você deveria ver:
>>>
<rethinkdb.net.Connection object at 0x101122410>
Saia do shell do Python, mas deixe o servidor RethinkDB em execução na outra janela do terminal.
Configurar um projeto Basic Flask
Crie um diretório para armazenar seu projeto
$ mkdir flask-rethink
$ cd flask-rethink
Configurar e ativar um virtualenv
$ virtualenv --no-site-packages env
$ source env/bin/activate
Instale o Flask e o Flask-WTF
$ pip install flask
$ pip install flask-wtf
Criar um arquivo de requisitos do Pip
$ pip freeze > requirements.txt
Faça o download do clichê do Flask
Encontrado no diretório de modelos deste repositório. A estrutura do seu projeto agora deve ficar assim:
├── app
│ ├── __init__.py
│ ├── forms.py
│ ├── models.py
│ ├── templates
│ │ ├── base.html
│ │ └── index.html
│ └── views.py
├── readme.md
├── requirements.txt
└── run.py
Execute o aplicativo
$ python run.py
Navegue até http://localhost:5000/ e você deverá ver:
Não tente enviar nada ainda, porque precisamos configurar o banco de dados primeiro. Vamos começar o RethinkDB.
Configuração do RethinkDB
Instale o RethinkDB
$ pip install rethinkdb
Adicione o seguinte código a "views.py"
# rethink imports
import rethinkdb as r
from rethinkdb.errors import RqlRuntimeError
# rethink config
RDB_HOST = 'localhost'
RDB_PORT = 28015
TODO_DB = 'todo'
# db setup; only run once
def dbSetup():
connection = r.connect(host=RDB_HOST, port=RDB_PORT)
try:
r.db_create(TODO_DB).run(connection)
r.db(TODO_DB).table_create('todos').run(connection)
print 'Database setup completed'
except RqlRuntimeError:
print 'Database already exists.'
finally:
connection.close()
dbSetup()
# open connection before each request
@app.before_request
def before_request():
try:
g.rdb_conn = r.connect(host=RDB_HOST, port=RDB_PORT, db=TODO_DB)
except RqlDriverError:
abort(503, "Database connection could be established.")
# close the connection after each request
@app.teardown_request
def teardown_request(exception):
try:
g.rdb_conn.close()
except AttributeError:
pass
Verifique os comentários para uma breve explicação do que cada uma das funções faz.
Inicie seu servidor novamente
Você deve ver o seguinte alerta em seu terminal:
Database setup completed
Se você vir este errorethinkdb.errors.RqlDriverError: Could not connect to localhost:28015.
seu servidor RethinkDB não está rodando. Abra uma nova janela de terminal e execute$ rethinkdb
.
Então, criamos um novo banco de dados chamado “todo”, que possui uma tabela chamada “todos”.
Você pode verificar isso no RethinkDB Admin. Navegue até http://localhost:8080/. O administrador deve carregar. Se você clicar em “Tabelas”, deverá ver o banco de dados e a tabela que criamos:
Exibir todos
Com a configuração do banco de dados, vamos adicionar código para exibir todos. Atualize o
index()
função em “views.py”:@app.route("/")
def index():
form = TaskForm()
selection = list(r.table('todos').run(g.rdb_conn))
return render_template('index.html', form=form, tasks=selection)
Aqui estamos selecionando a tabela “todos”, puxando todos os dados, que estão em JSON, e passando a tabela inteira para o template.
Adicionar dados manualmente
Antes de podermos visualizar qualquer todos, precisamos adicionar alguns primeiro. Vamos percorrer o shell e adicioná-los manualmente.
>>>
$ python
>>> import rethinkdb
>>> conn = rethinkdb.connect(db='todo')
>>> rethinkdb.table('todos').insert({'name':'sail to the moon'}).run(conn)
{u'errors': 0, u'deleted': 0, u'generated_keys': [u'c5562325-c5a1-4a78-8232-c0de4f500aff'], u'unchanged': 0, u'skipped': 0, u'replaced': 0, u'inserted': 1}
>>> rethinkdb.table('todos').insert({'name':'jump in the ocean'}).run(conn)
{u'errors': 0, u'deleted': 0, u'generated_keys': [u'0a3e3658-4513-48cb-bc68-5af247269ee4'], u'unchanged': 0, u'skipped': 0, u'replaced': 0, u'inserted': 1}
>>> rethinkdb.table('todos').insert({'name':'think of another todo'}).run(conn)
{u'errors': 0, u'deleted': 0, u'generated_keys': [u'b154a036-3c3b-47f4-89ec-cb9f4eff5f5a'], u'unchanged': 0, u'skipped': 0, u'replaced': 0, u'inserted': 1}
>>>
Então, nos conectamos ao banco de dados e inserimos três novos objetos na tabela dentro do banco de dados. Verifique os documentos da API para obter mais informações.
Acione o servidor. Agora você deve ver as três tarefas:
Finalize o formulário
Atualize o
index()
function novamente para extrair os dados do formulário e adicioná-los ao banco de dados:@app.route('/', methods = ['GET', 'POST'])
def index():
form = TaskForm()
if form.validate_on_submit():
r.table('todos').insert({"name":form.label.data}).run(g.rdb_conn)
return redirect(url_for('index'))
selection = list(r.table('todos').run(g.rdb_conn))
return render_template('index.html', form = form, tasks = selection)
Teste isso. Adicione alguns todos. Ficar louco.
Conclusão e Desafios
O aplicativo atual é funcional, mas há muito mais que podemos fazer. Leve este aplicativo para o próximo nível.
Veja algumas ideias:
- Adicione um login de usuário.
- Crie um formulário mais robusto, onde você possa adicionar uma data de vencimento para cada tarefa e, em seguida, classifique as tarefas por essa data antes de renderizá-las no DOM.
- Adicione testes funcionais e de unidade.
- Adicione a capacidade de criar subtarefas para cada tarefa.
- Leia os documentos de referência da API. Brinque com vários métodos.
- Modularize o aplicativo.
- Refatorar o código. Mostre seu novo código para o RethinkDB.
O que mais você gostaria de ver? Interessado em ver uma parte 2? Como você gosta do RethinkDB em comparação com o MongoDB? Compartilhe seus pensamentos abaixo.
Você pode pegar todo o código do repositório. Saúde!