【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
ディレクトリ構成
ディレクトリ構成は前回までと同様ですが一応載せておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | app.py ... 起動ファイル | config.py ... 設定ファイル | api ├── __init__.py ... FlaskApp本体 │ ├── database.py ... DB情報 │ ├── models ... Model群 │ └── users.py │ └── __init__.py │ └── views ... Controller群 └── user.py |
エラーハンドリングしてみる
実はFlaskには標準で便利なエラーハンドラーがついています。
errorhandlerというデコレータがあるのでそいつを使います。
api/views/user.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | 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 })) |
簡単なバリデーション処理を作ってみました。nameフィールドがリクエストBodyに存在しなかった場合にステータスコード400と共にエラーメッセージを返しています。
abort関数を使ってエラーを設定し、errorhandlerデコレータを使って受け取ったエラーをレスポンスするという感じですね。
ちなみに下記のように複数のエラーをまとめてしまう事もできます。
1 2 3 4 5 6 7 8 9 10 11 | @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 |
まとめ
さて、今回はエラーハンドリングについて書きました。結構簡単と思われた方も多いかと思います。
今回まで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