Rethink Flask - простой список задач, созданный Flask и RethinkDB

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/, и вы должны увидеть:

Flask todo list app screenshot

Пока не пытайтесь что-либо отправить, потому что сначала нам нужно настроить базу данных. Давайте начнем 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/. Админ должен загрузить. Если вы нажмете «Таблицы», вы увидите базу данных и таблицу, которую мы создали:

RethinkDB admin panel screenshot

Дисплей 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.с

Запустите сервер. Теперь вы должны увидеть три задачи:

Flask todo list app task list demo

Завершить форму

Снова обновите функцию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)

Проверьте это. Добавьте несколько задач. Сходить с ума.

Заключение и проблемы

Текущее приложение работает, но мы можем сделать гораздо больше. Возьмите это приложение на следующий уровень.

Вот несколько идей:

  1. Добавьте логин пользователя.

  2. Создайте более надежную форму, в которой вы можете добавить срок выполнения для каждой задачи, а затем отсортировать задачи по этой дате перед их отображением в DOM.

  3. Добавьте функционал иunit tests.

  4. Добавьте возможность создавать подзадачи для каждой задачи.

  5. Прочтите ссылку на APIdocs. Поиграйте с разными методами.

  6. Модульное приложение.

  7. Рефакторинг кода. Покажите свой новый код RethinkDB.

Что еще вы хотели бы увидеть? Хотите увидеть часть 2? Как вам RethinkDB по сравнению с MongoDB? Поделитесь своими мыслями ниже.

Вы можете взять весь код изrepo. Ура!