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:
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 erreur
rethinkdb.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:
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:
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:
-
Ajoutez une connexion utilisateur.
-
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.
-
Ajoutez fonctionnel etunit tests.
-
Ajoutez la possibilité de créer des sous-tâches pour chaque tâche.
-
Relisez la référence APIdocs. Jouez avec différentes méthodes.
-
Modularisez l'application.
-
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é!