Rethink Flask - простой список задач, созданный Flask и RethinkDB
После ряда запросов на базовый шаблонFlask иRethinkDB я решил пойти дальше и написать сообщение в блоге. Это тот пост.
Кстати: мы всегда приветствуем запросы. Если у вас есть что-то, о чем вы хотите, чтобы мы писали или строили, отправьте нам электронное письмо.
Сегодня мы создадим список делsimple, который вы сможете изменить в соответствии со своими потребностями. Прежде чем начать, я настоятельно рекомендую прочитать статьюthis, в которой подробно описывается, чем RethinkDB отличается от некоторых других баз данных NoSQL.
Настроить RethinkDB
Установить RethinkDB
Перейдите кhere и загрузите соответствующий пакет для вашей системы. Я использовал Homebrew -$ brew install rethinkdb
- и загрузка и установка сборки заняли почти двадцать минут:
==> 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
Установите драйверы Python глобально
$ sudo pip install rethinkdb
Note: Я установил Rethink глобально (за пределами virtualenv), так как, вероятно, я буду использовать одну и ту же версию с несколькими проектами на нескольких разных языках. Мы будем устанавливать в рамках virtualenv позже в этом уроке.
Проверьте свои настройки
Сначала давайте запустим сервер с помощью следующей команды:
$ rethinkdb
Если все установлено правильно, вы должны увидеть что-то похожее на:
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
Затем проверьте соединение. Откройте новое окно в своем терминале и введите следующие команды:
>>>
$ python
>>> import rethinkdb
>>> rethinkdb.connect('localhost', 28015).repl()
Тебе следует увидеть:
>>>
Выйдите из оболочки Python, но оставьте сервер RethinkDB запущенным в другом окне терминала.
Настройте проект Basic Flask
Создайте каталог для хранения вашего проекта
$ mkdir flask-rethink
$ cd flask-rethink
Настроить иactivate a virtualenv
$ virtualenv --no-site-packages env
$ source env/bin/activate
Установите Flask и Flask-WTF
$ pip install flask
$ pip install flask-wtf
Создайте файл требований Pip
$ pip freeze > requirements.txt
Скачать шаблонную колбу
Найдено в каталоге шаблонов репозиторияthis. Структура вашего проекта теперь должна выглядеть так:
├── app │ ├── __init__.py │ ├── forms.py │ ├── models.py │ ├── templates │ │ ├── base.html │ │ └── index.html │ └── views.py ├── readme.md ├── requirements.txt └── run.py
Запустите приложение
$ python run.py
Перейдите кhttp://localhost:5000/, и вы должны увидеть:
Пока не пытайтесь что-либо отправить, потому что сначала нам нужно настроить базу данных. Давайте начнем RethinkDB.
RethinkDB Config
Установить RethinkDB
$ pip install rethinkdb
Добавьте следующий код в «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
Проверьте комментарии для краткого объяснения того, что делает каждая из функций.
Запустите свой сервер снова
Вы должны увидеть следующее предупреждение в вашем терминале:
Database setup completed
Если вы видите эту ошибку
rethinkdb.errors.RqlDriverError: Could not connect to localhost:28015.
, ваш сервер RethinkDB не работает. Откройте новое окно терминала и запустите$ rethinkdb
.
Итак, мы создали новую базу данных под названием «todo», в которой есть таблица под названием «todos».
Вы можете проверить это в RethinkDB Admin. Перейдите кhttp://localhost:8080/. Админ должен загрузить. Если вы нажмете «Таблицы», вы увидите базу данных и таблицу, которую мы создали:
Дисплей Todos
С настройкой базы данных, давайте добавим код для отображения задач. Обновите функциюindex()
в «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)
Здесь мы выбираем таблицу «todos», извлекаем все данные из JSON и передаем всю таблицу в шаблон.
Добавить данные вручную
Прежде чем мы сможем просмотреть какие-либо задачи, мы должны сначала добавить некоторые. Давайте пройдемся по оболочке и добавим их вручную.
>>>
$ 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}
>>>
Итак, мы подключились к базе данных, а затем ввели три новых объекта в таблицу в базе данных. Check the API docs for more information.с
Запустите сервер. Теперь вы должны увидеть три задачи:
Завершить форму
Снова обновите функциюindex()
, чтобы извлечь данные из формы и добавить их в базу данных:
@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)
Проверьте это. Добавьте несколько задач. Сходить с ума.
Заключение и проблемы
Текущее приложение работает, но мы можем сделать гораздо больше. Возьмите это приложение на следующий уровень.
Вот несколько идей:
-
Добавьте логин пользователя.
-
Создайте более надежную форму, в которой вы можете добавить срок выполнения для каждой задачи, а затем отсортировать задачи по этой дате перед их отображением в DOM.
-
Добавьте функционал иunit tests.
-
Добавьте возможность создавать подзадачи для каждой задачи.
-
Прочтите ссылку на APIdocs. Поиграйте с разными методами.
-
Модульное приложение.
-
Рефакторинг кода. Покажите свой новый код RethinkDB.
Что еще вы хотели бы увидеть? Хотите увидеть часть 2? Как вам RethinkDB по сравнению с MongoDB? Поделитесь своими мыслями ниже.
Вы можете взять весь код изrepo. Ура!