Efter ett antal förfrågningar om en grundläggande Flask and RethinkDB-mall bestämde jag mig för att gå vidare och skriva ett blogginlägg. Det här är det inlägget.
BTW:Vi välkomnar alltid förfrågningar. Om du har något du vill att vi ska skriva om eller bygga, skicka ett mejl till oss.
Idag kommer vi att skapa en enkel att göra-lista, som du kommer att kunna ändra för att möta dina egna behov. Innan du börjar rekommenderar jag starkt att du läser den här artikeln, som beskriver hur RethinkDB skiljer sig från några av de andra NoSQL-databaserna.
Konfigurera RethinkDB
Installera RethinkDB
Navigera här och ladda ner lämpligt paket för ditt system. Jag använde Homebrew - $ brew install rethinkdb
- och det tog nästan tjugo minuter att ladda ner och installera builden:
==> 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
Installera Python-drivrutinerna globalt
$ sudo pip install rethinkdb
Obs! Jag installerade Rethink globalt (utanför en virtualenv) eftersom jag förmodligen kommer att använda samma version med ett antal projekt, med ett antal olika språk. Vi kommer att installera i en virtualenv senare i denna handledning.
Testa din installation
Låt oss först starta servern med följande kommando:
$ rethinkdb
Om allt är korrekt installerat bör du se något som liknar:
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
Testa sedan anslutningen. Öppna ett nytt fönster i din terminal och ange följande kommandon:
>>>$ python
>>> import rethinkdb
>>> rethinkdb.connect('localhost', 28015).repl()
Du bör se:
>>><rethinkdb.net.Connection object at 0x101122410>
Avsluta Python-skalet men lämna RethinkDB-servern igång i det andra terminalfönstret.
Skapa ett Basic Flask-projekt
Skapa en katalog för att lagra ditt projekt
$ mkdir flask-rethink
$ cd flask-rethink
Konfigurera och aktivera en virtuell miljö
$ virtualenv --no-site-packages env
$ source env/bin/activate
Installera Flask och Flask-WTF
$ pip install flask
$ pip install flask-wtf
Skapa en Pip-kravfil
$ pip freeze > requirements.txt
Ladda ner kolvens pannplåt
Finns i mallkatalogen för denna repo. Din projektstruktur bör nu se ut så här:
├── 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
Navigera till http://localhost:5000/ och du bör se:
Försök inte skicka in något ännu, eftersom vi måste konfigurera en databas först. Låt oss sätta igång RethinkDB.
RethinkDB Config
Installera RethinkDB
$ pip install rethinkdb
Lägg till följande kod i "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 kommentarerna för en kort förklaring av vad var och en av funktionerna gör.
Starta din server igen
Du bör se följande varning i din terminal:
Database setup completed
Om du ser det här felet
rethinkdb.errors.RqlDriverError: Could not connect to localhost:28015.
din RethinkDB-server körs inte. Öppna ett nytt terminalfönster och kör$ rethinkdb
.
Så vi skapade en ny databas som heter "todo", som har en tabell som heter "todos".
Du kan verifiera detta i RethinkDB Admin. Navigera till http://localhost:8080/. Administratören bör ladda. Om du klickar på "Tabell" bör du se databasen och tabellen vi skapade:
Visa uppgifter
Med databasinställningen, låt oss lägga till kod för att visa uppgifter. Uppdatera 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)
Här väljer vi "todos"-tabellen, drar all data, som finns i JSON, och skickar hela tabellen till mallen.
Lägg till data manuellt
Innan vi kan se några uppgifter måste vi lägga till några först. Låt oss gå igenom skalet och lägga till dem manuellt.
>>>$ 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 kopplade till databasen och skrev sedan in tre nya objekt i tabellen i databasen. Kontrollera API-dokumenten för mer information.
Starta servern. Du bör nu se de tre uppgifterna:
Slutför formuläret
Uppdatera index()
funktion igen för att hämta data från formuläret och lägga till dem i 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)
Testa detta. Lägg till några todos. Bli galen.
Slutsats och utmaningar
Den nuvarande appen är funktionell, men det finns mycket mer vi kan göra. Ta den här appen till nästa nivå.
Här är några idéer:
- Lägg till en användarinloggning.
- Skapa ett mer robust formulär där du kan lägga till ett förfallodatum för varje uppgift och sedan sortera uppgifterna efter det datumet innan du renderar dem till DOM.
- Lägg till funktions- och enhetstester.
- Lägg till möjligheten att skapa underuppgifter för varje uppgift.
- Läs över API-referensdokumenten. Lek med olika metoder.
- Modularisera appen.
- Refaktorera koden. Visa upp din nya kod för RethinkDB.
Vad mer skulle du vilja se? Intresserad av att se en del 2? Hur gillar du RethinkDB i jämförelse med MongoDB? Dela dina tankar nedan.
Du kan hämta all kod från repot. Skål!