Rethink Flask - Eine einfache Todo-Liste mit Flask und RethinkDB
Nach einer Reihe von Anfragen nach einer grundlegenden Vorlage fürFlask undRethinkDB habe ich beschlossen, einen Blog-Beitrag zu schreiben. Dies ist dieser Beitrag.
Übrigens: Wir freuen uns immer über Anfragen. Wenn Sie etwas haben, über das wir schreiben oder das wir bauen sollen, schreiben Sie uns eine E-Mail.
Heute erstellen wir einesimple-Aufgabenliste, die Sie an Ihre eigenen Anforderungen anpassen können. Bevor ich anfange, empfehle ich dringend, mehr alsthisArtikel zu lesen, in dem detailliert beschrieben wird, wie sich RethinkDB von einigen anderen NoSQL-Datenbanken unterscheidet.
RethinkDB einrichten
Installieren Sie RethinkDB
Navigieren Sie zuhere und laden Sie das entsprechende Paket für Ihr System herunter. Ich habe Homebrew -$ brew install rethinkdb
- verwendet und es dauerte fast zwanzig Minuten, um den Build herunterzuladen und zu installieren:
==> 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
Installieren Sie die Python-Treiber global
$ sudo pip install rethinkdb
Note: Ich habe Rethink global (außerhalb einer virtuellen Umgebung) installiert, da ich wahrscheinlich dieselbe Version mit einer Reihe von Projekten und verschiedenen Sprachen verwenden werde. Wir werden später in diesem Tutorial in einer virtuellen Umgebung installieren.
Testen Sie Ihr Setup
Starten wir den Server zunächst mit dem folgenden Befehl:
$ rethinkdb
Wenn alles korrekt installiert ist, sollten Sie Folgendes sehen:
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
Testen Sie dann die Verbindung. Öffnen Sie ein neues Fenster in Ihrem Terminal und geben Sie die folgenden Befehle ein:
>>>
$ python
>>> import rethinkdb
>>> rethinkdb.connect('localhost', 28015).repl()
Das solltest du sehen:
>>>
Beenden Sie die Python-Shell, lassen Sie den RethinkDB-Server jedoch im anderen Terminalfenster laufen.
Richten Sie ein Basic Flask-Projekt ein
Erstellen Sie ein Verzeichnis zum Speichern Ihres Projekts
$ mkdir flask-rethink
$ cd flask-rethink
Einrichten undactivate a virtualenv
$ virtualenv --no-site-packages env
$ source env/bin/activate
Installieren Sie den Kolben und den Kolben-WTF
$ pip install flask
$ pip install flask-wtf
Erstellen Sie eine Pip-Anforderungsdatei
$ pip freeze > requirements.txt
Laden Sie die Kolbenplatte herunter
Gefunden im Vorlagenverzeichnis vonthis Repo. Ihre Projektstruktur sollte nun folgendermaßen aussehen:
├── app │ ├── __init__.py │ ├── forms.py │ ├── models.py │ ├── templates │ │ ├── base.html │ │ └── index.html │ └── views.py ├── readme.md ├── requirements.txt └── run.py
Führen Sie die App aus
$ python run.py
Navigieren Sie zuhttp://localhost:5000/, und Sie sollten Folgendes sehen:
Versuchen Sie noch nicht, etwas einzureichen, da wir zuerst eine Datenbank einrichten müssen. Lassen Sie uns RethinkDB in Gang bringen.
RethinkDB Config
Installieren Sie RethinkDB
$ pip install rethinkdb
Fügen Sie den folgenden Code zu "views.py" hinzu.
# 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
In den Kommentaren finden Sie eine kurze Erläuterung der Funktionen der einzelnen Funktionen.
Starten Sie Ihren Server erneut
In Ihrem Terminal sollte die folgende Warnung angezeigt werden:
Database setup completed
Wenn Sie diesen Fehler
rethinkdb.errors.RqlDriverError: Could not connect to localhost:28015.
sehen, wird Ihr RethinkDB-Server nicht ausgeführt. Öffnen Sie ein neues Terminalfenster und führen Sie$ rethinkdb
aus.
Deshalb haben wir eine neue Datenbank mit dem Namen "todo" erstellt, die eine Tabelle mit dem Namen "todos" enthält.
Sie können dies im RethinkDB-Administrator überprüfen. Navigieren Sie zuhttp://localhost:8080/. Der Administrator sollte laden. Wenn Sie auf "Tabellen" klicken, sollten die von uns erstellte Datenbank und Tabelle angezeigt werden:
Todos anzeigen
Fügen Sie beim Einrichten der Datenbank Code hinzu, um Aufgaben anzuzeigen. Aktualisieren Sie dieindex()
-Funktion 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)
Hier wählen wir die "todos" -Tabelle aus, ziehen alle Daten in JSON und übergeben die gesamte Tabelle an die Vorlage.
Daten manuell hinzufügen
Bevor wir Aufgaben anzeigen können, müssen wir zuerst einige hinzufügen. Lassen Sie uns die Shell durchgehen und sie manuell hinzufügen.
>>>
$ 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}
>>>
Also haben wir uns mit der Datenbank verbunden und dann drei neue Objekte in die Tabelle innerhalb der Datenbank eingegeben. Check the API docs for more information.
Starten Sie den Server. Sie sollten nun die drei Aufgaben sehen:
Schließen Sie das Formular ab
Aktualisieren Sie die Funktionindex()
erneut, um die Daten aus dem Formular abzurufen und zur Datenbank hinzuzufügen:
@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)
Testen Sie dies. Fügen Sie einige Aufgaben hinzu. Verrückt werden.
Fazit & Herausforderungen
Die aktuelle App ist funktionsfähig, aber wir können noch viel mehr tun. Bringen Sie diese App auf die nächste Stufe.
Hier einige Ideen:
-
Fügen Sie eine Benutzeranmeldung hinzu.
-
Erstellen Sie ein robusteres Formular, in dem Sie für jede Aufgabe ein Fälligkeitsdatum hinzufügen und die Aufgaben dann nach diesem Datum sortieren können, bevor Sie sie in das DOM rendern.
-
Addiere funktionale undunit tests.
-
Fügen Sie die Möglichkeit hinzu, Unteraufgaben für jede Aufgabe zu erstellen.
-
Lesen Sie die API-Referenzdocs durch. Spielen Sie mit verschiedenen Methoden.
-
Modularisieren Sie die App.
-
Refactor den Code. Zeigen Sie RethinkDB Ihren neuen Code.
Was möchten Sie noch sehen? Möchten Sie einen Teil 2 sehen? Wie gefällt Ihnen RethinkDB im Vergleich zu MongoDB? Teilen Sie Ihre Gedanken unten.
Sie können den gesamten Code ausrepo abrufen. Prost!