flask-restplus

Nam Eun-Ji·2020년 11월 28일
0

response

  • Resource는 Flask pluggable view위에 구축되어 있어, 리소스에서 메소드를 정의하는 것만으로 여러 HTTP 메소드에 쉽게 액세스할 수 있다.
  • 여러 반환 값을 사용하여 응답 코드 및 응답 헤더 설정을 지원한다.
# Default to 200 OK
class Todo1(Resource):
    def get(self):
        return {'task': 'Hello world'}

# Set the response code to 201
class Todo2(Resource):
    def get(self):
        return {'task': 'Hello world'}, 201

# Set the response code to 201 and return custom headers
class Todo3(Resource):
    def get(self):
        return {'task': 'Hello world'}, 201, {'Etag': 'some-opaque-string'}


route (+ multiple urls)

add_resource() 메서드나 route() decorator에 여러 URL을 전달할 수 있다.

api.add_resource(HelloWorld, '/hello', '/world')

class HelloWorld(Resource):
    pass
@api.route('/hello', '/world')
class HelloWorld(Resource):
    pass


url 형식 체크

  • argparse 모듈과 달리 parse_args()는 사용자 지정 데이터 구조 대신 dict로 반환한다.
  • RequestParser 클래스는 인수가 유효성 검사를 통과하지 못하면 400을 반환한다.
  • parse_args(strict=True)로 호출하면 정의하지 않은 이수가 포함된 경우 오류가 발생한다.
from flask_restplus import reqparse

parser = reqparse.RequestParser()
parser.add_argument('rate', type=int, help='Rate to charge for this resource')
args = parser.parse_args()
$ curl -d 'rate=foo' http://127.0.0.1:5000/todos
{'status': 400, 'message': 'foo cannot be converted to int'}
args = parser.parse_args(strict=True)


데이터 형식 체크 / 직렬화 - marshal_with()

  • marshal_with()는 data object를 가져와 field 필터링을 적용하는 것
  • marshal_with()로 uri 혹은 리턴 값의 데이터 형식도 체크 가능하다.
  • marshal_with()는 스웨거 문서화도 가능하다.
from flask import Flask
from flask_restplus import fields, Api, Resource

app = Flask(__name__)
api = Api(app)

model = api.model('Model', {
    'task': fields.String,
    'uri': fields.Url('todo_ep')
})

class TodoDao(object):
    def __init__(self, todo_id, task):
        self.todo_id = todo_id
        self.task = task

        # This field will not be sent in the response
        self.status = 'active'


@api.route('/todo')
class Todo(Resource):
    @api.marshal_with(model)
    def get(self, **kwargs):
        return TodoDao(todo_id='my_todo', task='Remember the milk')


renaming attribute

공개 필드이름이 내부 필드 이름과 다를 경우 attribute 키워드 인자를 사용하면 된다.

model = {
    'name': fields.String(attribute='private_name'),
    'address': fields.String,
}

model = {
    'name': fields.String(attribute=lambda x: x._private_name),
    'address': fields.String,
}
profile
한 줄 소개가 자연스러워지는 그날까지

0개의 댓글