이런 코드가 있다.
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/a', methods=['POST'])
def a():
try:
data = request.get_json()['a']
return jsonify({'message': data}), 200
except KeyError:
return jsonify({'massage': 'KEY_ERROR'}), 400
@app.route('/b', methods=['POST'])
def b():
try:
data = request.get_json()['b']
return jsonify({'message': data}), 200
except KeyError:
return jsonify({'massage': 'KEY_ERROR'}), 400
if __name__ == '__main__':
app.run(host='127.0.0.1', debug=True, port=8001)
분명 잘동작하는 코드지만 KeyError
관련해서 중복의 냄새가 난다.
특히 POST의 경우 KeyError처리는 필수적이기 때문에 이러한 중복은 계속늘어날 수 있다.
flask에서는 친절하게도 이런 에러처리를 도와주는 decorator가 있다.
도와줘요 공식문서
대충 decorator에 처리하고 싶은 에러를 넣어주면 해당함수에서 처리해주고
decorator를 쓰기 싫으면 app에다 등록도 할 수 있다는 것 같다.
손가락이 근질근질하다. 바로 해보자.
from flask import Flask, jsonify, request
app = Flask(__name__)
# error handler
@app.errorhandler(KeyError)
def handler_key_error():
return jsonify({'massage': 'KEY_ERROR'}), 400
@app.route('/a', methods=['POST'])
def a():
# try:
data = request.get_json()['a']
return jsonify({'message': data}), 200
# except KeyError:
# return jsonify({'massage': 'KEY_ERROR'}), 400
@app.route('/b', methods=['POST'])
def b():
# try:
data = request.get_json()['b']
return jsonify({'message': data}), 200
# except KeyError:
# return jsonify({'massage': 'KEY_ERROR'}), 400
if __name__ == '__main__':
app.run(host='127.0.0.1', debug=True, port=8001)
기능은 동일하지만 중복은 줄었다.
배웠으면 당장 refactoring하자