Rethink Flask - Eine einfache Todo-Liste mit Flask und RethinkDB

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:

Flask todo list app screenshot

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 Fehlerrethinkdb.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:

RethinkDB admin panel screenshot

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:

Flask todo list app task list demo

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:

  1. Fügen Sie eine Benutzeranmeldung hinzu.

  2. 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.

  3. Addiere funktionale undunit tests.

  4. Fügen Sie die Möglichkeit hinzu, Unteraufgaben für jede Aufgabe zu erstellen.

  5. Lesen Sie die API-Referenzdocs durch. Spielen Sie mit verschiedenen Methoden.

  6. Modularisieren Sie die App.

  7. 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!