Po řadě žádostí o základní šablonu Flask a RethinkDB jsem se rozhodl napsat článek na blog. Toto je ten příspěvek.
BTW:Žádosti vždy vítáme. Pokud máte něco, o čem byste chtěli napsat nebo vytvořit, napište nám.
Dnes vytvoříme jednoduché seznam úkolů, který si budete moci upravit podle svých potřeb. Než začnete, velmi doporučuji přečíst si tento článek, který podrobně popisuje, jak se RethinkDB liší od některých jiných databází NoSQL.
Nastavte RethinkDB
Nainstalujte RethinkDB
Přejděte sem a stáhněte si příslušný balíček pro váš systém. Použil jsem Homebrew - $ brew install rethinkdb
- a stažení a instalace sestavení trvalo téměř dvacet minut:
==> 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
Globálně nainstalujte ovladače Pythonu
$ sudo pip install rethinkdb
Poznámka: Nainstaloval jsem Rethink globálně (mimo virtualenv), protože pravděpodobně budu stejnou verzi používat s řadou projektů s řadou různých jazyků. Později v tomto tutoriálu provedeme instalaci v rámci virtualenv.
Otestujte své nastavení
Nejprve spusťte server následujícím příkazem:
$ rethinkdb
Pokud je vše správně nainstalováno, měli byste vidět něco podobného:
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
Poté otestujte připojení. Otevřete nové okno v terminálu a zadejte následující příkazy:
>>>$ python
>>> import rethinkdb
>>> rethinkdb.connect('localhost', 28015).repl()
Měli byste vidět:
>>><rethinkdb.net.Connection object at 0x101122410>
Ukončete prostředí Pythonu, ale ponechte server RethinkDB spuštěný v druhém okně terminálu.
Nastavení projektu Basic Flask
Vytvořte adresář pro uložení projektu
$ mkdir flask-rethink
$ cd flask-rethink
Nastavení a aktivace virtuálního prostředí
$ virtualenv --no-site-packages env
$ source env/bin/activate
Instalujte Flask a Flask-WTF
$ pip install flask
$ pip install flask-wtf
Vytvořte soubor požadavků Pip
$ pip freeze > requirements.txt
Stáhněte si základní verzi Flask
Nachází se v adresáři šablon tohoto úložiště. Struktura vašeho projektu by nyní měla vypadat takto:
├── app
│ ├── __init__.py
│ ├── forms.py
│ ├── models.py
│ ├── templates
│ │ ├── base.html
│ │ └── index.html
│ └── views.py
├── readme.md
├── requirements.txt
└── run.py
Spusťte aplikaci
$ python run.py
Přejděte na http://localhost:5000/ a měli byste vidět:
Zatím se nepokoušejte nic odesílat, protože nejprve potřebujeme nastavit databázi. Začněme RethinkDB.
RethinkDB Config
Nainstalujte RethinkDB
$ pip install rethinkdb
Přidejte následující kód do „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
Podívejte se do komentářů, kde najdete stručné vysvětlení toho, co každá z funkcí dělá.
Znovu spusťte server
V terminálu byste měli vidět následující upozornění:
Database setup completed
Pokud se zobrazí tato chyba
rethinkdb.errors.RqlDriverError: Could not connect to localhost:28015.
váš server RethinkDB není spuštěn. Otevřete nové okno terminálu a spusťte$ rethinkdb
.
Vytvořili jsme tedy novou databázi nazvanou „todo“, která má tabulku nazvanou „todos“.
Můžete si to ověřit v RethinkDB Admin. Přejděte na http://localhost:8080/. Admin by se měl načíst. Pokud kliknete na „Tabulky“, měli byste vidět databázi a tabulku, kterou jsme vytvořili:
Zobrazit úkoly
S nastavením databáze přidejte kód pro zobrazení úkolů. Aktualizujte index()
funkce v „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)
Zde vybíráme tabulku „todos“, stahujeme všechna data, která jsou v JSON, a předáváme celou tabulku šabloně.
Přidat data ručně
Než si budeme moci prohlédnout nějaké úkoly, musíme je nejprve přidat. Pojďme si projít shell a přidat je ručně.
>>>$ 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}
>>>
Připojili jsme se tedy k databázi a poté do tabulky v databázi zadali tři nové objekty. Další informace naleznete v dokumentaci k rozhraní API.
Spusťte server. Nyní byste měli vidět tři úkoly:
Dokončete formulář
Aktualizujte index()
funkci znovu vytáhnout data z formuláře a přidat je do databáze:
@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)
Vyzkoušejte to. Přidejte nějaké úkoly. Zbláznit se.
Závěr a výzvy
Aktuální aplikace je funkční, ale můžeme udělat mnohem víc. Posuňte tuto aplikaci na další úroveň.
Zde je několik nápadů:
- Přidejte přihlašovací údaje uživatele.
- Vytvořte robustnější formulář, do kterého můžete přidat datum dokončení pro každý úkol a poté úkoly seřadit podle tohoto data, než je vykreslíte do modelu DOM.
- Přidejte funkční a jednotkové testy.
- Přidejte možnost vytvářet dílčí úkoly pro každý úkol.
- Přečtěte si referenční dokumenty API. Pohrajte si s různými metodami.
- Modularizovat aplikaci.
- Refaktorujte kód. Pochlubte se svým novým kódem RethinkDB.
Co byste ještě rádi viděli? Máte zájem vidět 2. díl? Jak se vám líbí RethinkDB ve srovnání s MongoDB? Podělte se o své myšlenky níže.
Můžete získat veškerý kód z repozitáře. Na zdraví!