webargs로 파싱을 하다 필드가 없거나 없어야 하는 필드가 넘어오거나 타입이 안맞거나 아무튼 문제가 있으면 abort로 예외를 보낸다.
이 경우 기본은 402 응답이 와야하는데 이상하게 아래와 같이 500이 와서 로그를 보니
TypeError: Object of type GeneratedSchema is not JSON serializable
어떤 부분이 문제인지 조금 더 찾아보니 handle_error로 넘어오는 schema를 abort로 넘기고 있다. 스키마를 결과에 보여주고 싶었나? FlaskParser를 제외한 다른 파서들에선 안넘기는데 실수인가 싶기도 하고...실수면 많은 사람들이 알아야하는데 검색해도 안나오는 것을 보면 내쪽이 뭘 잘못했나 싶기도 하고.
아무튼 그 부분이 문제라 아래와 같이 schema는 안넘기게 수정하고 이 모듈을 불러 사용하도록 수정함.
from webargs.flaskparser import FlaskParser, abort
class FlaskRestXParser(FlaskParser):
def handle_error(self, error, req, schema, *, error_status_code, error_headers):
status_code = error_status_code or self.DEFAULT_VALIDATION_STATUS
abort(
status_code,
exc=error,
messages=error.messages,
headers=error_headers,
)
parser = FlaskRestXParser()
use_args = parser.use_args
use_kwargs = parser.use_kwargs
__all__ = ['FlaskRestXParser', 'parser', 'use_args', 'use_kwargs']
조금 더 보니 그냥 error_handler를 등록하면 된다.
import flask
from webargs.flaskparser import parser
from werkzeug.exceptions import HTTPException
@parser.error_handler
def handle_error(error, req, schema, *, error_status_code, error_headers):
status_code = error_status_code or parser.DEFAULT_VALIDATION_STATUS
try:
flask.abort(status_code)
except HTTPException as err:
err.exc = error
err.data = dict(
messages=error.messages,
headers=error_headers
)
raise err
'개발 > 파이썬' 카테고리의 다른 글
Python으로 http 서버 띄우기 (0) | 2020.12.16 |
---|---|
파라메터를 정의하는 새로운 방법 (0) | 2020.12.07 |
문자열을 결합하는 몇가지 방법 (0) | 2020.12.03 |
print로 개행 없이 출력 (0) | 2020.02.07 |
SQLAlchemy + MySQL에서 DATETIME에 millisecond 사용 (0) | 2020.01.21 |
댓글