【Python】Flask + MySQL + SQLAlchemyでAPIを開発してみよう Part2
2019.09.09

こんにちは、せんだです。
ようやく夏の厳しい暑さが落ちついてきたかな?と思う今日この頃。
と見せかけてまだまだ涼しいとは程遠い(主観です)ので、皆さま体調管理にはお気をつけ下さいませ。
さて、前回に引き続きPythonの軽量フレームワーク「Flask」を使ったAPIの作り方について書きます。
前回の記事はこちら
【Python】Flask + MySQL + SQLAlchemyでAPIを開発してみよう Part1
前回はFlaskのインストール、ルーティング、レスポンスの雛形をとりあえず作りました。
今回やることはこちら。
今回やること
- モジュールのインストール
- DB連携の設定
- モデルの作成
- 取得したデータをJSON形式で返す
環境
端末:Mac Book Pro
Pythonバージョン: 3.6.8
Flaskバージョン: 1.0.3
MySQLバージョン: 5.7
SQLAlchemy バージョン:1.3.4
ディレクトリ構成
ディレクトリ構成はこんな感じです。
[cc_bash]
app.py … 起動ファイル
|
config.py … 設定ファイル
|
api
├── __init__.py … FlaskApp本体
│
├── database.py … DB情報
│
├── models … Model群
│ └── users.py
│ └── __init__.py
│
└── views … Controller群
└── user.py
[/cc_bash]
モジュールのインストール
今回使うモジュールをインストールします。
[cc_bash]
$ pip install SQLAlchemy, Flask-SQLAlchemy, Flask-Cors, marshmallow, marshmallow-sqlalchemy, flask-marshmallow
[/cc_bash]
DB連携の設定
DB接続に必要なコードを書いていきます。
conifg.py
[cc_python]
class SystemConfig:
DEBUG = True
SQLALCHEMY_DATABASE_URI = ‘mysql+pymysql://{user}:{password}@{host}/{db_name}?charset=utf8’.format(**{
‘user’: ‘<接続ユーザー>‘,
‘password’: ‘<接続パスワード>‘,
‘host’: ‘<接続先ホスト>‘,
‘db_name’: ‘<接続先データベース名>‘
})
Config = SystemConfig
[/cc_python]
あくまで必要最低限ですが、DBの接続情報を記述しています。
最後の
[cc_python]
Config = SystemConfig
[/cc_python]
という記述でConfigという名前で外部ファイルから読み込める様にしています。
api/database.py
[cc_python]
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
db = SQLAlchemy()
ma = Marshmallow()
# アプリでDB操作を行えるように初期設定する
def init_db(app):
db.init_app(app)
[/cc_python]
FlaskアプリからSQLAlchemyとMarshmallowを使う為の定義をしています。
api/__init__.py
[cc_python]
from flask import Flask, make_response, jsonify
from .views.user import user_router
from flask_cors import CORS
from api.database import db
import config
def create_app():
app = Flask(__name__)
# CORS対応
CORS(app)
# DB設定を読み込む
app.config.from_object(‘config.Config’)
db.init_app(app)
app.register_blueprint(user_router, url_prefix=’/api’)
return app
app = create_app()
[/cc_python]
先ほど設定したconfig.py、database.pyを読み込み、Flaskアプリを起動します。
とりあえず、これでSQLAlchemyを使ったDB連携の下準備が整いました。
モデルの作成
次はモデルを書いて、SQLAlChemyを使って、データの操作を行います。
api/models/user.py
[cc_python]
from api.database import db, ma
class User(db.Model):
__tablename__ = ‘users’
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(50), nullable=False)
address= db.Column(db.String(100), nullable=True)
tel = db.Column(db.String(20), nullable=True)
mail = db.Column(db.String(100), nullable=True)
def __repr__(self):
return ‘
def getUserList():
# select * from users
user_list = db.session.query(User).all()
if user_list == None:
return []
else:
return user_list
def registUser(user):
record = User(
name = user[‘name’],
address = user[‘address’],
tel = user[‘tel’],
mail = user[‘mail’]
)
# insert into users(name, address, tel, mail) values(…)
db.session.add(record)
db.session.commit()
return user
class UserSchema(ma.ModelSchema):
class Meta:
model = User
fields = (‘id’, ‘name’, ‘address’, ‘tel’, ‘mail’)
[/cc_python]
こんな感じにDBの構造を定義します。
下の方に書いたのは、ユーザー一覧取得用のメソッドと登録用のメソッドです。
[cc_python]
class UserSchema(ma.ModelSchema):
class Meta:
model = User
fields = (‘id’, ‘name’, ‘address’, ‘tel’, ‘mail’)
[/cc_python]
取得したデータをJSON形式で返す
最後にモデルを使って、DB操作を行いJSON形式でレスポンスします。
api/views/user.py
[cc_python]
from flask import Blueprint, request, make_response, jsonify
from api.models import User, UserSchema
import json
# ルーティング設定
user_router = Blueprint(‘user_router’, __name__)
@user_router.route(‘/users’, methods=[‘GET’])
def getUserList():
users = User.getUserList()
user_schema = UserSchema(many=True)
return make_response(jsonify({
‘code’: 200,
‘users’: user_schema.dump(users).data
}))
@user_router.route(‘/users’, methods=[‘POST’])
def registUser():
# jsonデータを取得する
jsonData = json.dumps(request.json)
userData = json.loads(jsonData)
user = User.registUser(userData)
user_schema = UserSchema(many=True)
return make_response(jsonify({
‘code’: 200,
‘user’: user
}))
[/cc_python]
先ほど、準備したモデルを使ってコントローラーを記述します。
上記のようにModelを読み込む際は api/models/__init__.pyに下記を追記します。
api/models/__init__.py
[cc_python]
from .user import User, UserSchema
[/cc_python]
確認
api/usersにPOST、GETでアクセスするとそれぞれステータス200が返ってくるかと思います。
[GET] api/users
[cc_bash]
# レスポンス
{
“code”: 200,
“users”: [
{
“address”: “茨城県つくば市千現”,
“id”: 1,
“mail”: “ichirou@swallow-incubate.com”,
“name”: “鈴木一郎”,
“tel”: “0281234567”
},
{
“address”: “茨城県つくば市千現”,
“id”: 2,
“mail”: “jirou@swallow-incubate.com”,
“name”: “佐藤二郎”,
“tel”: “0281234567”
}
]
}
[/cc_bash]
[POST] api/users
[cc_bash]
# リクエストbody
{
“name”: “山田太郎”,
“address”:”茨城県つくば市千現”,
“tel”:”02812345678″,
“mail”:”blogtest@swallow-incubate.com”
}
# レスポンス
{
“code”: 200,
“user”: {
“address”: “茨城県つくば市千現”,
“mail”: “blogtest@swallow-incubate.com”,
“name”: “山田太郎”,
“tel”: “0281234567”
}
}
[/cc_bash]
まとめ
今回はFlaskとSQLAlchemyを使って実際にMySQLとの連携部分を実装しました。
ここまでで、とりあえずFlask + MySQL + SQLAlchemyでWeb APIを作る事ができたと思います。
それでは、また次回!
Flask + MySQL + SQLAlchemyシリーズ
↓↓↓ぜひチェックしてください
~提供中のヒューマンセンシング技術~
◆人物検出技術
歩行者・来店者数計測やロボット搭載も
https://humandetect.pas-ta.io
◆視線検出技術
アイトラッキングや次世代UIに
https://eyetrack.pas-ta.io
◆生体判定技術
eKYC・顔認証のなりすまし対策を!
https://bio-check.pas-ta.io
◆目検出技術
あらゆる目周りデータを高精度に取得
https://pupil.pas-ta.io
◆音声感情認識技術
会話から怒りや喜びの感情を判定
https://feeling.pas-ta.io
◆虹彩認証技術
目の虹彩を利用した生体認証技術
https://iris.pas-ta.io
