sql >> データベース >  >> RDS >> Database

Flaskの再考–FlaskとRethinkDBを利用したシンプルなTodoリスト

    基本的なFlaskおよびRethinkDBテンプレートを何度もリクエストした後、私は先に進んでブログ投稿を書くことにしました。これがその投稿です。

    ところで:私たちは常にリクエストを歓迎します。私たちに書いてもらいたい、または作成してほしいものがあれば、私たちにメールを送ってください。

    今日はシンプルを作成します ToDoリスト。自分のニーズに合わせて変更できます。始める前に、RethinkDBが他のNoSQLデータベースとどのように異なるかを詳しく説明しているこの記事を読むことを強くお勧めします。


    RethinkDBを設定する


    RethinkDBのインストール

    ここに移動して、システムに適切なパッケージをダウンロードします。 Homebrewを使用しました-$ brew install rethinkdb -ビルドのダウンロードとインストールには約20分かかりました:

    ==> 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
    

    注: 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()
    

    表示されるはずです:

    >>>
    <rethinkdb.net.Connection object at 0x101122410>
    

    Pythonシェルを終了しますが、RethinkDBサーバーは他のターミナルウィンドウで実行したままにします。




    基本的なFlaskプロジェクトを設定する


    プロジェクトを保存するディレクトリを作成します

    $ mkdir flask-rethink
    $ cd flask-rethink
    


    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
    


    フラスコボイラープレートをダウンロード

    このリポジトリのテンプレートディレクトリにあります。プロジェクト構造は次のようになります。

    ├── 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構成


    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を実行します 。

    そこで、「todos」というテーブルを持つ「todo」という新しいデータベースを作成しました。

    これは、RethinkDB管理者で確認できます。 http:// localhost:8080/に移動します。管理者がロードする必要があります。 [テーブル]をクリックすると、作成したデータベースとテーブルが表示されます。



    Todoの表示

    データベースを設定したら、タスクを表示するコードを追加しましょう。 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であるすべてのデータをプルして、テーブル全体をテンプレートに渡します。



    手動でデータを追加

    ToDoを表示する前に、まずいくつかを追加する必要があります。シェルを調べて、手動で追加してみましょう。

    >>>
    $ 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}
    >>>
    

    そこで、データベースに接続し、データベース内のテーブルに3つの新しいオブジェクトを入力しました。 詳細については、APIドキュメントを確認してください。

    サーバーを起動します。これで、3つのタスクが表示されます。



    フォームを完成させる

    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)
    

    これをテストしてください。いくつかのtodoを追加します。夢中になる。




    結論と課題

    現在のアプリは機能していますが、できることはまだまだたくさんあります。このアプリを次のレベルに引き上げましょう。

    ここにいくつかのアイデアがあります:

    1. ユーザーログインを追加します。
    2. より堅牢なフォームを作成します。このフォームでは、各ToDoの期日を追加し、その日付でToDoを並べ替えてからDOMにレンダリングできます。
    3. 機能テストと単体テストを追加します。
    4. タスクごとにサブタスクを作成する機能を追加します。
    5. APIリファレンスドキュメントをお読みください。さまざまな方法で遊んでください。
    6. アプリをモジュール化します。
    7. コードをリファクタリングします。新しいコードをRethinkDBに見せびらかしてください。

    他に何を見たいですか?パート2をご覧になりたいですか? MongoDBと比較してRethinkDBはどのように気に入っていますか?以下であなたの考えを共有してください。

    リポジトリからすべてのコードを取得できます。乾杯!



    1. MySQLINステートメントのPDOバインディング値

    2. PostgreSQLで末尾のスペースをトリミングする

    3. Oracle:複数のテーブルの更新=> ORA-01779:キーが保持されていないテーブルにマップする列を変更できません

    4. SQLiteで外部キーサポートを有効にする方法