FlaskRESTfulAPIを作成しMongoAtlasデータベースにアクセスする

FlaskRESTfulAPIを作成しMongoAtlasデータベースにアクセスしてみます。

今回MongoAtlasを使用しますので、事前にMongoDBAtlasのユーザーアカウントを作成する必要があります。

■Python

今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows10)(pythonランチャーでの確認)

■MongoDBにログインする

まずは、作成したユーザーアカウントでMongodb(https://account.mongodb.com/account/login)にログインします。

■クラスタを用意する

ログイン後、左メニューから「DEPLOYMENT」の項目で「Database」をクリックします。クリックすると「Database Deployments」が表示されます。今回はデフォルトで作成されていた「Cluster0」というクラスタを用います。

■接続の設定

次に、データベースに接続できるように設定を行っていきますので、この「Cluster0」クラスタ内で「Connect」ボタンをクリックします。

クリックすると、「Connect to Cluster0」というウインドウが表示されますので、ウインドウ内の「Connect your application」をクリックします。

クリックすると、「Select your driver and verison」と表示されますので、今回「Python」を用いて接続を行いますので、ドライバーは「Python」を選択し、バージョンは「3.6 or later」とします。

選択後、「Add your connection string into your aoolication code」にコードが表示されますので、このコードをコピーします。このコードはデータベースに接続するために必要なものです。

コピーした情報は、メモ帳などに保存します。保存後「Close」ボタンをクリックし、ウインドウを閉じます。

■データベースとテーブルの作成

閉じた後に、「Cluster0」クラスタ内の「Browse Collections」ボタンをクリックします。

クリックすると、「Collections」タブが開き、「Explore Your Data」と表示されます。タブ内の「Add My Own Data」ボタンをクリックします。

クリックすると、「Create Database」というウインドウが表示されます。ウインドウ内の「

入力後「

クリックすると、

■FlaskRESTfulAPIを作成する

作成後、今度はFlaskRESTfulAPIを作成していきます。作成するためにflask, pymongo, dnspython, flask_corsのライブラリをインストールします。インストール後、コードエディタを開きk,FlaskRESTfulAPIのコードを書いていきます。

■コード

from flask import Flask
from flask_cors import CORS
import pymongo

connection_url = 'mongodb+srv://ユーザー名:パスワード@cluster0.cywla.mongodb.net/?retryWrites=true&w=majority'
app = Flask(__name__)
client = pymongo.MongoClient(connection_url)

Database = client.get_database('test_db')

SampleTable = Database.sampletable

if __name__ == '__main__':
    app.run(debug=True)

今回のコードはflaskやflask_cors,pymongoモジュールを呼び出します。その後にconnection_urlという変数を定義し、その中に先程保存したデータベース接続に必要なコードを格納します。この際に「ユーザー名:パスワード」の部分を、お持ちのアカウントのユーザー名とパスワードに変更します。

格納後、「app = Flask(__name__)」で、Flaskクラスのインスタンスを作成します。作成後、「client = pymongo.MongoClient(connection_url)」でpymongo.MongoClient()の括弧内に引数,パラメータとして、connection_urlを渡し、データベースへの接続を行います。

その後、Databaseという変数を定義し、その中でget_database()を用います。括弧内には引数,パラメータとして、今回作成したデータベースである「test_db」を渡します。これでデータベースの情報が取得されDatabase変数に格納されます。

さらにSampleTableという変数を定義し、その中でDatabase変数に対して、今回作成したテーブルである「sampletable」の情報を引き出し、SampleTable変数内に格納します。

最後にapp.run()を用いてflaskアプリケーションを実行します。この時に括弧内に引数,パラメータとして、「debug=True」を渡します。これでデバッグ出力機能が有効となります。

■実行・検証

このスクリプトを「restfulapi_test.py」という名前で、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。

C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\cryptography\x509\base.py:514: CryptographyDeprecationWarning: Parsed a negative serial number, which is disallowed by RFC 5280.
  return rust_x509.load_pem_x509_certificate(data)
 * Serving Flask app "restfulapi_test" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Restarting with windowsapi reloader
C:\Users\user_\AppData\Roaming\Python\Python38\site-packages\cryptography\x509\base.py:514: CryptographyDeprecationWarning: Parsed a negative serial number, which is disallowed by RFC 5280.
  return rust_x509.load_pem_x509_certificate(data)
 * Debugger is active!
 * Debugger PIN: 107-688-714
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

実行してみると、上記のメッセージが出力されました。出力された内容を確認すると、「Running on http://127.0.0.1:5000/」と出力されており、正常に実行されることが確認できました。

確認後、Webブラウザを起動し、アドレスバーにURLを入力すると、「404 Not Found」で「The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.(要求されたURLはサーバーで見つかりませんでした。URLを手動で入力した場合は、スペルを確認してもう一度やり直してください。)」と表示されます。

今回の作成したスクリプトファイルは、ルートを作成していないので、上記のようなエラーが表示されます。

■データベースに1つのドキュメントを挿入する

表示されますので、「restfulapi_test.py」というスクリプトファイルを変更します。まずは、データベースに1つのドキュメントを挿入してみます。

■コード

from flask import Flask
from flask_cors import CORS
import pymongo

connection_url = 'mongodb+srv://ユーザー名:パスワード@cluster0.cywla.mongodb.net/?retryWrites=true&w=majority'
app = Flask(__name__)
client = pymongo.MongoClient(connection_url)

Database = client.get_database('test_db')

SampleTable = Database.sampletable

@app.route('/insert-one/<name>/<id>/', methods=['GET'])
def insertOne(name,id):
    queryQbject = {
        'Name': name,
        'ID': id
    }
    query = SampleTable.insert_one(queryQbject)
    return "クエリが挿入されました"

if __name__ == '__main__':
    app.run(debug=True)
   

変更内容としては、「@app.route()」を用いて「/insert-one/<name>/<id>/」というルートを作成します。この際に、引数,パラメータとして、「methods=['GET']」を渡し、GETのリクエストをルーティングしています。

ルートを作成した後、作成したルートにGETリクエストを送信した時に呼び出される関数を定義します。今回はinsertOneという関数を定義し、呼び出された時に実行される処理としては、queryQbjectというJSON形式データを作成します。この時に、ルートで「name」と「id」をGETリクエスト送信していますので、このデータがqueryQbjectに格納されます。格納後、queryQbject内のデータを、insert_one()を用いて、データベースのテーブル(コレクション)にデータを挿入し、returnとして日本語の文字列を返すものです。

■実行・検証

変更したスクリプトを「restfulapi_test.py」という名前で、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。

実行してみると、上記のメッセージが出力されますので、Webブラウザを起動し、アドレスバーに「http://127.0.0.1:5000/」を入力しアクセスしますが、この時に「/insert-one/<name>/<id>/」を追加で入力します。なお、「name」の部分はデータベースのテーブルに追加する名前で、「id」の部分はデータベースのテーブルに追加するIDに変更します。今回は「/insert-one/tanaka/1/」とします。

アドレスバーに「http://127.0.0.1:5000/」と入力し、その後に「/insert-one/tanaka/1/」と入力し、アクセスすると「クエリが挿入されました」と表示されました。これでデータベースのテーブル(コレクション)に「name」と「id」のクエリが送信され、挿入されました。

表示後、実際に挿入されたのか「Cloud: MongoDB Cloud」にアクセスし、「Cluster0」クラスタ内を確認すると、「test_db」データベース内の「sampletable」というコレクションにGETリクエストで送信したデータが挿入されていることが確認できました。

■日本語のデータを挿入する

確認後、今度は日本語のデータを挿入してみます。今回は「name」を「田中テスト太郎」とし、このデータを挿入します。挿入するためには、文字コード「UTF-8(65001)」でエンコードします。

今回は「

http://127.0.0.1:5000/insert-one/%E7%94%B0%E4%B8%AD%E3%83%86%E3%82%B9%E3%83%88%E5%A4%AA%E9%83%8E/2/

」とし、「id」は「2」とします。これをGETリクエストで送信してみます。

送信してみると、「クエリが挿入されました」と表示されました。表示後、実際に挿入されたのか「Cloud: MongoDB Cloud」にアクセスし、「Cluster0」クラスタ内のデータベースを確認してみます。

確認してみると、データベース内のコレクションに日本語のデータが挿入されていることが確認できました。

■コレクション(テーブル)内の全てのドキュメントを検索する

確認後、今度はコレクション(テーブル)内の全てのドキュメントを検索し出力してみます。出力するために、「restfulapi_test.py」というスクリプトファイルを変更します。

■コード

from flask import Flask
from flask_cors import CORS
from flask import jsonify
import pymongo

connection_url = 'mongodb+srv://kazu:un43ynGWuPaYVQ6@cluster0.cywla.mongodb.net/?retryWrites=true&w=majority'
app = Flask(__name__)
client = pymongo.MongoClient(connection_url)

Database = client.get_database('test_db')

SampleTable = Database.sampletable

@app.route('/insert-one/<name>/<id>/', methods=['GET'])
def insertOne(name,id):
    queryQbject = {
        'Name': name,
        'ID': id
    }
    query = SampleTable.insert_one(queryQbject)
    return "クエリが挿入されました"

@app.route('/find/',methods=['GET'])
def findAll():
    query = SampleTable.find()
    output = {}
    i = 0
    for x in query:
        output[i] = x
        output[i].pop('_id')
        i += 1
    return jsonify(output)    

if __name__ == '__main__':
    app.run(debug=True)
   

変更内容としては、「@app.route()」を用いて「/find/」というルートを作成します。この際に、引数,パラメータとして、「methods=['GET']」を渡し、GETのリクエストをルーティングしています。ルートを作成した後、作成したルートにGETリクエストを送信した時に呼び出される関数を定義します。今回はfindAllという関数を定義し、呼び出された時に実行される処理としては、データベースのコレクション(テーブル)内でfind()を用いて文字列の位置を取得します。取得した位置を「0」に設定(i = 0)しfor in文を用いて、コレクション(テーブル)内をデータを「0」から順番にoutput変数に格納していきます。この時にpop()を用いて「_id」(要素)は削除します。さらに順番に取得していきますので、「i = 0」を”+=”(累算代入演算子)を用いてiに+1を加算します。そして最後にjsonify()を用いて、output変数内のデータをjson形式でreturnとして返します。

なお、jsonify()を用いますので、「from import」でflaskモジュールのjsonifyを呼び出す必要があります。これを呼び出さないと「jsonify is not defined」というエラーが発生します。

■実行・検証

変更したスクリプトを「restfulapi_test.py」という名前で、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。

実行してみると、上記のメッセージが出力されますので、Webブラウザを起動し、アドレスバーに「http://127.0.0.1:5000/」を入力しアクセスしますが、この時に「/find/」を追加で入力します。

入力しアクセスすると、データベースのコレクション内のデータがJSON形式で表示されることを確認できました。なお、残念ながら日本語の文字列は文字化けしてしまいました。

コメント

タイトルとURLをコピーしました