Repenser le flacon - Une simple liste de choses à faire alimentée par Flask et RethinkDB

Repenser le flacon - Une simple liste de choses à faire alimentée par Flask et RethinkDB

Après un certain nombre de demandes pour un modèle de baseFlask etRethinkDB, j'ai décidé de continuer et d'écrire un article de blog. Ceci est ce poste.

BTW: Nous accueillons toujours les demandes. Si vous avez quelque chose sur lequel vous aimeriez que nous écrivions ou que nous élaborions, envoyez-nous un e-mail.

Aujourd'hui, nous allons créer une liste de tâchessimple, que vous pourrez modifier pour répondre à vos propres besoins. Avant de commencer, je suggère fortement de lire l'article dethis, qui détaille en quoi RethinkDB diffère de certaines des autres bases de données NoSQL.

Configurer RethinkDB

Installer RethinkDB

Naviguez danshere et téléchargez le package approprié pour votre système. J'ai utilisé Homebrew -$ brew install rethinkdb - et il a fallu près de vingt minutes pour télécharger et installer la version:

==> 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

Installez les pilotes Python globalement

$ sudo pip install rethinkdb

Note: J'ai installé Rethink globalement (en dehors d'un virtualenv) car j'utiliserai probablement la même version avec un certain nombre de projets, avec un certain nombre de langues différentes. Nous installerons dans un virtualenv plus tard dans ce tutoriel.

Testez votre configuration

Commençons par démarrer le serveur avec la commande suivante:

$ rethinkdb

Si tout est installé correctement, vous devriez voir quelque chose de similaire à:

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

Testez ensuite la connexion. Ouvrez une nouvelle fenêtre dans votre terminal et entrez les commandes suivantes:

>>>

$ python
>>> import rethinkdb
>>> rethinkdb.connect('localhost', 28015).repl()

Tu devrais voir:

>>>

Quittez le shell Python mais laissez le serveur RethinkDB s'exécuter dans l'autre fenêtre de terminal.

Configurer un projet Basic Flask

Créez un répertoire pour stocker votre projet

$ mkdir flask-rethink
$ cd flask-rethink

Configurer etactivate a virtualenv

$ virtualenv --no-site-packages env
$ source env/bin/activate

Installer le ballon et le ballon-WTF

$ pip install flask
$ pip install flask-wtf

Créer un fichier d'exigences Pip

$ pip freeze > requirements.txt

Téléchargez le passe-partout Flask

Trouvé dans le répertoire de modèles du dépôtthis. La structure de votre projet devrait maintenant ressembler à ceci:

├── app
│   ├── __init__.py
│   ├── forms.py
│   ├── models.py
│   ├── templates
│   │   ├── base.html
│   │   └── index.html
│   └── views.py
├── readme.md
├── requirements.txt
└── run.py

Exécutez l'application

$ python run.py

Accédez àhttp://localhost:5000/, et vous devriez voir:

Flask todo list app screenshot

N'essayez pas de soumettre quoi que ce soit pour le moment, car nous devons d'abord obtenir une configuration de base de données. Lançons RethinkDB.

RethinkDB Config

Installer RethinkDB

$ pip install rethinkdb

Ajoutez le code suivant à "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

Consultez les commentaires pour une brève explication de ce que font chacune des fonctions.

Redémarrez votre serveur

Vous devriez voir l'alerte suivante dans votre terminal:

Database setup completed

Si vous voyez cette erreurrethinkdb.errors.RqlDriverError: Could not connect to localhost:28015., votre serveur RethinkDB n'est pas en cours d'exécution. Ouvrez une nouvelle fenêtre de terminal et exécutez$ rethinkdb.

Nous avons donc créé une nouvelle base de données appelée «todo», qui a une table appelée «todos».

Vous pouvez le vérifier dans l'administrateur RethinkDB. Accédez àhttp://localhost:8080/. L'administrateur devrait se charger. Si vous cliquez sur «Tables», vous devriez voir la base de données et la table que nous avons créées:

RethinkDB admin panel screenshot

Afficher les Todos

Avec la configuration de la base de données, ajoutons du code pour afficher les tâches. Mettez à jour la fonctionindex() dans «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)

Ici, nous sélectionnons la table "todos", tirons toutes les données, qui sont en JSON, et passons la table entière au modèle.

Ajouter des données manuellement

Avant de pouvoir afficher les todos, nous devons d'abord en ajouter. Parcourons le shell et ajoutons-les manuellement.

>>>

$ 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}
>>>

Nous nous sommes donc connectés à la base de données, puis avons entré trois nouveaux objets dans la table de la base de données. Check the API docs for more information.

Lancez le serveur. Vous devriez maintenant voir les trois tâches:

Flask todo list app task list demo

Finaliser le formulaire

Mettez à jour à nouveau la fonctionindex() pour extraire les données du formulaire et les ajouter à la base de données:

@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)

Testez cela. Ajoutez des todos. Devenir fou.

Conclusion et défis

L'application actuelle est fonctionnelle, mais nous pouvons faire beaucoup plus. Faites passer cette application au niveau supérieur.

Voici quelques idées:

  1. Ajoutez une connexion utilisateur.

  2. Créez un formulaire plus robuste, où vous pouvez ajouter une date d'échéance pour chaque tâche, puis trier les tâches par cette date avant de les rendre dans le DOM.

  3. Ajoutez fonctionnel etunit tests.

  4. Ajoutez la possibilité de créer des sous-tâches pour chaque tâche.

  5. Relisez la référence APIdocs. Jouez avec différentes méthodes.

  6. Modularisez l'application.

  7. Refactorisez le code. Montrez votre nouveau code à RethinkDB.

Qu'aimeriez-vous voir d'autre? Intéressé à voir une partie 2? Comment aimez-vous RethinkDB par rapport à MongoDB? Partagez vos réflexions ci-dessous.

Vous pouvez récupérer tout le code desrepo. À votre santé!