본문 바로가기
개발/파이썬

Flask-restx와 webargs에서 TypeError 처리

by 장모 2020. 12. 7.

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

 

 

 

댓글