Database
 sql >> Base de Dados >  >> RDS >> Database

Rethink Flask – Uma lista de tarefas simples desenvolvida por Flask e RethinkDB


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 erro rethinkdb.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:
  1. Adicione um login de usuário.
  2. 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.
  3. Adicione testes funcionais e de unidade.
  4. Adicione a capacidade de criar subtarefas para cada tarefa.
  5. Leia os documentos de referência da API. Brinque com vários métodos.
  6. Modularize o aplicativo.
  7. 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!