Efter en række anmodninger om en grundlæggende Flask and RethinkDB skabelon, besluttede jeg at gå videre og skrive et blogindlæg. Dette er det indlæg.
BTW:Vi hilser altid anmodninger velkommen. Hvis du har noget, du gerne vil have os til at skrive om eller bygge, så send os en e-mail.
I dag laver vi en simpel todo-liste, som du vil være i stand til at ændre for at opfylde dine egne behov. Før jeg begynder, anbefaler jeg stærkt at læse denne artikel, som beskriver, hvordan RethinkDB adskiller sig fra nogle af de andre NoSQL-databaser.
Konfigurer RethinkDB
Installer RethinkDB
Naviger her og download den passende pakke til dit system. Jeg brugte Homebrew - $ brew install rethinkdb
- og det tog næsten tyve minutter at downloade og installere 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
Installer Python-driverne globalt
$ sudo pip install rethinkdb
Bemærk: Jeg installerede Rethink globalt (uden for en virtualenv), da jeg sandsynligvis vil bruge den samme version med en række projekter, med en række forskellige sprog. Vi installerer i en virtualenv senere i denne tutorial.
Test din opsætning
Lad os først starte serveren med følgende kommando:
$ rethinkdb
Hvis alt er installeret korrekt, bør du se noget, der ligner:
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
Test derefter forbindelsen. Åbn et nyt vindue i din terminal, og indtast følgende kommandoer:
>>>$ python
>>> import rethinkdb
>>> rethinkdb.connect('localhost', 28015).repl()
Du skal se:
>>><rethinkdb.net.Connection object at 0x101122410>
Afslut Python-skallen, men lad RethinkDB-serveren køre i det andet terminalvindue.
Opsæt et Basic Flask-projekt
Opret en mappe til at gemme dit projekt
$ mkdir flask-rethink
$ cd flask-rethink
Konfigurer og aktiver en virtualenv
$ virtualenv --no-site-packages env
$ source env/bin/activate
Installer Flask og Flask-WTF
$ pip install flask
$ pip install flask-wtf
Opret en Pip-kravfil
$ pip freeze > requirements.txt
Download Flask-kedelpladen
Findes i skabelonbiblioteket i denne repo. Din projektstruktur skulle nu se sådan ud:
├── app
│ ├── __init__.py
│ ├── forms.py
│ ├── models.py
│ ├── templates
│ │ ├── base.html
│ │ └── index.html
│ └── views.py
├── readme.md
├── requirements.txt
└── run.py
Kør appen
$ python run.py
Naviger til http://localhost:5000/, og du bør se:
Forsøg ikke at indsende noget endnu, for vi skal først have en databaseopsætning. Lad os sætte gang i RethinkDB.
RethinkDB Config
Installer RethinkDB
$ pip install rethinkdb
Tilføj følgende kode til "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
Se kommentarerne for en kort forklaring af, hvad hver af funktionerne gør.
Start din server igen
Du bør se følgende advarsel i din terminal:
Database setup completed
Hvis du ser denne fejl rethinkdb.errors.RqlDriverError: Could not connect to localhost:28015.
din RethinkDB-server kører ikke. Åbn et nyt terminalvindue og kør $ rethinkdb
.
Så vi oprettede en ny database kaldet "todo", som har en tabel kaldet "todos".
Du kan bekræfte dette i RethinkDB Admin. Naviger til http://localhost:8080/. Administratoren skal indlæse. Hvis du klikker på "Tabeller", skal du se den database og tabel, vi har oprettet:
Vis Todos
Med databaseopsætningen, lad os tilføje kode for at vise todos. Opdater index()
funktion i "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)
Her vælger vi "todos"-tabellen, trækker alle data, som er i JSON, og sender hele tabellen til skabelonen.
Tilføj data manuelt
Før vi kan se nogle gøremål, skal vi først tilføje nogle. Lad os gå gennem skallen og tilføje dem manuelt.
>>>$ 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}
>>>
Så vi oprettede forbindelse til databasen og indtastede derefter tre nye objekter i tabellen i databasen. Tjek API-dokumenterne for at få flere oplysninger.
Tænd serveren. Du skulle nu se de tre opgaver:
Fuldfør formularen
Opdater index()
funktion igen for at trække dataene fra formularen og tilføje dem til databasen:
@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)
Test dette af. Tilføj nogle gøremål. Gå amok.
Konklusion og udfordringer
Den nuværende app er funktionel, men der er meget mere, vi kan gøre. Tag denne app til det næste niveau.
Her er et par ideer:
- Tilføj et brugerlogin.
- Opret en mere robust formular, hvor du kan tilføje en forfaldsdato for hver opgave, og derefter sortere opgaverne efter den dato, før du gengiver dem til DOM.
- Tilføj funktions- og enhedstests.
- Tilføj muligheden for at oprette underopgaver for hver opgave.
- Læs API-referencedokumenterne. Leg med forskellige metoder.
- Modulariser appen.
- Omfaktorer koden. Vis din nye kode frem til RethinkDB.
Hvad vil du ellers gerne se? Interesseret i at se en del 2? Hvordan kan du lide RethinkDB i forhold til MongoDB? Del dine tanker nedenfor.
Du kan hente al koden fra repoen. Skål!