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形式で表示されることを確認できました。なお、残念ながら日本語の文字列は文字化けしてしまいました。
コメント