Dopo una serie di richieste per un modello Flask e RethinkDB di base, ho deciso di andare avanti e scrivere un post sul blog. Questo è quel post.
A proposito:accogliamo sempre le richieste. Se hai qualcosa di cui vorresti che scrivessimo o che costruissimo, inviaci un'email.
Oggi creeremo un semplice todo list, che potrai modificare in base alle tue esigenze. Prima di iniziare, suggerisco caldamente di leggere questo articolo, che descrive in dettaglio come RethinkDB differisce da alcuni degli altri database NoSQL.
Configura RethinkDB
Installa RethinkDB
Naviga qui e scarica il pacchetto appropriato per il tuo sistema. Ho usato Homebrew - $ brew install rethinkdb
- e ci sono voluti quasi venti minuti per scaricare e installare la build:
==> 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
Installa i driver Python a livello globale
$ sudo pip install rethinkdb
Nota: Ho installato Rethink a livello globale (al di fuori di un virtualenv) poiché probabilmente utilizzerò la stessa versione con un numero di progetti, con un numero di lingue diverse. Installeremo in un virtualenv più avanti in questo tutorial.
Verifica la tua configurazione
Innanzitutto, avviamo il server con il seguente comando:
$ rethinkdb
Se tutto è installato correttamente, dovresti vedere qualcosa di simile 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
Quindi testare la connessione. Apri una nuova finestra nel tuo terminale e inserisci i seguenti comandi:
>>>$ python
>>> import rethinkdb
>>> rethinkdb.connect('localhost', 28015).repl()
Dovresti vedere:
>>><rethinkdb.net.Connection object at 0x101122410>
Esci dalla shell Python ma lascia il server RethinkDB in esecuzione nell'altra finestra del terminale.
Imposta un progetto Flask di base
Crea una directory in cui archiviare il tuo progetto
$ mkdir flask-rethink
$ cd flask-rethink
Configura e attiva virtualenv
$ virtualenv --no-site-packages env
$ source env/bin/activate
Installa Flask e Flask-WTF
$ pip install flask
$ pip install flask-wtf
Crea un file dei requisiti Pip
$ pip freeze > requirements.txt
Scarica il boilerplate di Flask
Trovato nella directory dei modelli di questo repository. La struttura del tuo progetto ora dovrebbe apparire così:
├── app
│ ├── __init__.py
│ ├── forms.py
│ ├── models.py
│ ├── templates
│ │ ├── base.html
│ │ └── index.html
│ └── views.py
├── readme.md
├── requirements.txt
└── run.py
Esegui l'app
$ python run.py
Vai a http://localhost:5000/ e dovresti vedere:
Non provare a inviare ancora nulla, perché prima dobbiamo ottenere una configurazione del database. Diamo vita a RethinkDB.
Configurazione RethinkDB
Installa RethinkDB
$ pip install rethinkdb
Aggiungi il seguente codice 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
Controlla i commenti per una breve spiegazione di ciò che fa ciascuna delle funzioni.
Riavvia il tuo server
Dovresti vedere il seguente avviso nel tuo terminale:
Database setup completed
Se viene visualizzato questo errore rethinkdb.errors.RqlDriverError: Could not connect to localhost:28015.
il tuo server RethinkDB non è in esecuzione. Apri una nuova finestra di terminale ed esegui $ rethinkdb
.
Quindi, abbiamo creato un nuovo database chiamato “todo”, che ha una tabella chiamata “todos”.
Puoi verificarlo in RethinkDB Admin. Passare a http://localhost:8080/. L'amministratore dovrebbe caricare. Se fai clic su "Tabelle", dovresti vedere il database e la tabella che abbiamo creato:
Mostra Cose da fare
Con l'impostazione del database, aggiungiamo il codice per visualizzare le cose da fare. Aggiorna index()
funzione in “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)
Qui selezioniamo la tabella "todos", estraiamo tutti i dati, che sono in JSON, e passiamo l'intera tabella al modello.
Aggiungi dati manualmente
Prima di poter visualizzare le cose da fare, dobbiamo prima aggiungerne alcune. Esaminiamo la shell e li aggiungiamo 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}
>>>
Quindi, ci siamo collegati al database, quindi abbiamo inserito tre nuovi oggetti nella tabella all'interno del database. Controlla i documenti dell'API per ulteriori informazioni.
Accendi il server. Ora dovresti vedere le tre attività:
Finalizza il modulo
Aggiorna index()
funzione di nuovo per estrarre i dati dal modulo e aggiungerli al database:
@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)
Prova questo. Aggiungi alcune cose da fare. Impazzire.
Conclusione e sfide
L'app attuale è funzionale, ma c'è molto di più che possiamo fare. Porta questa app al livello successivo.
Ecco alcune idee:
- Aggiungi un accesso utente.
- Crea un modulo più solido, in cui puoi aggiungere una data di scadenza per ogni cosa da fare, quindi ordinare le cose da fare in base a quella data prima di renderle al DOM.
- Aggiungi test funzionali e unitari.
- Aggiungi la possibilità di creare attività secondarie per ciascuna attività.
- Leggi i documenti di riferimento dell'API. Gioca con vari metodi.
- Modulare l'app.
- Refactoring del codice. Mostra il tuo nuovo codice a RethinkDB.
Cos'altro vorresti vedere? Interessato a vedere una parte 2? Ti piace RethinkDB rispetto a MongoDB? Condividi i tuoi pensieri di seguito.
Puoi prendere tutto il codice dal repository. Saluti!