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

2019.10.07

Pythonはじめました

 

 

こんにちは、せんだです。

 

さて、今回も引き続き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シリーズ


Top