【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

 

ディレクトリ構成

 

ディレクトリ構成は前回までと同様ですが一応載せておきます。

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シリーズ


Top