Après un certain nombre de demandes pour un modèle de base Flask et RethinkDB, j'ai décidé d'aller de l'avant et d'écrire un article de blog. C'est ce message.
BTW :Nous accueillons toujours les demandes. Si vous avez quelque chose sur lequel vous aimeriez que nous écrivions ou que nous construisions, envoyez-nous un e-mail.
Aujourd'hui, nous allons créer un simple liste de tâches, que vous pourrez modifier pour répondre à vos propres besoins. Avant de commencer, je vous suggère fortement de lire cet article, qui détaille en quoi RethinkDB diffère de certaines des autres bases de données NoSQL.
Configurer RethinkDB
Installer RethinkDB
Naviguez ici 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 le build :
==> 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
Installer les pilotes Python globalement
$ sudo pip install rethinkdb
Remarque : 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 correctement installé, 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 saisissez les commandes suivantes :
>>>$ python
>>> import rethinkdb
>>> rethinkdb.connect('localhost', 28015).repl()
Vous devriez voir :
>>><rethinkdb.net.Connection object at 0x101122410>
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 et activer un environnement virtuel
$ virtualenv --no-site-packages env
$ source env/bin/activate
Installer Flask et Flask-WTF
$ pip install flask
$ pip install flask-wtf
Créer un fichier d'exigences Pip
$ pip freeze > requirements.txt
Télécharger le passe-partout Flask
Trouvé dans le répertoire de modèles de ce dépôt. 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
Lancer 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 configurer une base de données. Lançons RethinkDB.
Repenser la configuration DB
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 fait 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 ne fonctionne pas. 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 contient une table appelée "todos".
Vous pouvez le vérifier dans l'administrateur RethinkDB. Accédez à http://localhost:8080/. L'administrateur devrait charger. Si vous cliquez sur "Tables", vous devriez voir la base de données et la table que nous avons créées :
Afficher les tâches
Avec la configuration de la base de données, ajoutons du code pour afficher les tâches. Mettre à jour le index()
fonction 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", extrayons toutes les données, qui sont au format JSON, et transmettons la table entière au modèle.
Ajouter des données manuellement
Avant de pouvoir afficher les tâches, nous devons d'abord en ajouter. Passons en revue 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. Consultez la documentation de l'API pour plus d'informations.
Lancez le serveur. Vous devriez maintenant voir les trois tâches :
Finaliser le formulaire
Mettre à jour le index()
fonction à nouveau 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 ceci. Ajoutez quelques tâches. Deviens 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 :
- Ajouter une connexion utilisateur.
- Créez un formulaire plus robuste, dans lequel vous pouvez ajouter une date d'échéance pour chaque tâche, puis triez les tâches en fonction de cette date avant de les afficher dans le DOM.
- Ajouter des tests fonctionnels et unitaires.
- Ajoutez la possibilité de créer des sous-tâches pour chaque tâche.
- Lisez les documents de référence de l'API. Jouez avec différentes méthodes.
- Modularisez l'application.
- Refactoriser le code. Montrez votre nouveau code à RethinkDB.
Qu'aimeriez-vous voir d'autre ? Intéressé à voir une partie 2? Comment trouvez-vous RethinkDB par rapport à MongoDB ? Partagez vos pensées ci-dessous.
Vous pouvez récupérer tout le code du référentiel. Santé !