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

こんにちは、せんだです。
さて、今回も引き続きPythonの軽量フレームワーク「Flask」を使ったAPIの作り方について書いていこうと思います。
前回までの記事はこちら
【Python】Flask + MySQL + SQLAlchemyでAPIを開発してみよう Part1
【Python】Flask + MySQL + SQLAlchemyでAPIを開発してみよう Part2
前回はFlask、MySQL、SQLAlchemyを使ってDBの連携部分を作りました。
今回やることはこちら。
今回やること
- エラーハンドリング
システム開発で避けては通れないエラーハンドリングの方法について触れてみます。
と言っても実装自体は実にシンプルです。
環境
端末: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]
エラーハンドリングしてみる
実はFlaskには標準で便利なエラーハンドラーがついています。
errorhandlerというデコレータがあるのでそいつを使います。
api/views/user.py
[cc_python]
from flask import Blueprint, request, make_response, jsonify, abort #←abortを追加
from api.models import User, UserSchema
import json
# ルーティング設定
user_router = Blueprint(‘user_router’, __name__)
@user_router.errorhandler(400) # 追加
def error_handler(err):
res = jsonify({
‘error’: {
‘message’: err.description[‘message’]
},
‘code’: err.code
})
return res, err.code
@user_router.route(‘/users’, methods=[‘GET’])
def getUserList():
try:
users = User.getUserList()
user_schema = UserSchema(many=True)
except ValueError:
print(‘error’)
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)
if not ‘name’ in userData:
abort(400, {
‘message’: ‘Name is a required!!’
})
try:
user = User.registUser(userData)
user_schema = UserSchema(many=True)
except ValueError:
print(‘error’)
return make_response(jsonify({
‘code’: 200,
‘user’: user
}))
[/cc_python]
簡単なバリデーション処理を作ってみました。nameフィールドがリクエストBodyに存在しなかった場合にステータスコード400と共にエラーメッセージを返しています。
abort関数を使ってエラーを設定し、errorhandlerデコレータを使って受け取ったエラーをレスポンスするという感じですね。
ちなみに下記のように複数のエラーをまとめてしまう事もできます。
[cc_python]
@user_router.errorhandler(400)
@user_router.errorhandler(401) # 追加
@user_router.errorhandler(403) # 追加
def error_handler(err):
res = jsonify({
‘error’: {
‘message’: err.description[‘message’]
},
‘code’: err.code
})
return res, err.code
[/cc_python]
まとめ
さて、今回はエラーハンドリングについて書きました。結構簡単と思われた方も多いかと思います。
今回まで3回にわたって、Flask + MySQL + SQLAlchemyでサクッとAPIを作ってみよう!をモットーにやってきましたがいかがでしたでしょうか?
とりあえず動いたでしょ!?じゃあ、ひとまず目的達成です 笑
せんだ自身もpython初心者なので、また何か新しいことを覚えたら記事にしたいと思います。
それでは、また!
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
