[Python] Flask & flask-restplus && swagger ui Develop Tip

파이썬으로 Backend RESTful API 등을 작성할 때, 주로 Flask를 이용합니다.

참고:

위와 같은 정도로 플래스크 관련 블로깅을 했던 것 같습니다.

그동안 이렇게 작성한 백엔드 API를 테스트 하는데, 
curl을 이용한 쉘 스크립트로 작업을 해 왔었습니다.

예)

#!/bin/bash
source .config.sh
URL=${URL_BASE}/version
PARAM=
echo "version================================================================"
echo "GET ${URL}"
echo "  PARAM=${PARAM}"
echo "-----------------------------------------------------------------------"
$CURL -i ${URL}
echo


그런데 이번에 swagger ui 라는 것을 알게 되었습니다.
이미 npm 패키지로 유명한 것인데 간단히 웹으로 해당 API 스펙이 보이고 
직접 테스트해 볼 수 있게 되어있는 것인데 이제야 알게 되었네 ... 했답니다.

그러다가 구글에서 python swagger 로 검색을 해 보니, 
flask-restplus 라는 패키지도 발견하였습니다.

워낙 플래스크에 붙는 모듈이 많아서 그냥 넘어갈까 하다가, 기존에 작업해 놓았던 RESTful API 에 
적용을 해 보려 살펴보았더니 이것이 보면 볼 수록 딱 원하는 기능들을 넣어 둔 것이었습니다.

기존에 작업해 놓았던 여러가지 작업을 더 줄일 수 있게 될 것 같습니다.

이것과 더불어 Swagger UI 도 간단히 설명해 봅니다.

Api 를 flask_restplus 에 있는 것을 사용합니다. Flask의 Api 를 패러미터로 초기화하여 사용합니다.

HelloWorld 최소 코드 입니다.

우선 기존의 순수 Flask 에 비하여 틀린 점은,

함수를 return 할 때 해당 dict를 jsonify를 시켜 리턴시켰는데 위의 경우는 그냥 dict를 리턴하면 알아서
jsonify 시키는 것으로 이해 됩니다.

기존의 Flask Resource 클래스 이용 방법과 거의 동일합니다.

실제 메서드 return 시 기본적인 것은 dict 결과를 return 해도 되고,
HTTP Response 코드를 추가하려면 dict, 201 과 같은 tuple을 리턴하고,
커스텀 HTTP Header를 추가하려면
dict, 201, custom_head_dict
와 같은 형식의 tuple로 리턴하면 됩니다. (콤마로 구분된 리턴은 결국 해당 tuple 입니다)

플래스크 매뉴얼을 자세히 보지 못했지만 이런식으로 여러 route 도 가능하네요.

기존에는 GET, POST, PUT 등에 따라 request.args, request,json 등에서 패러미터를 구해 오고는 했는데,
위와같이 패러미터 검증 방법을 이용하면 아주 쓸모 있겠습니다.

MVC 모델링에서와 같은 모델링을 위한 방법과 marshal_with 등을 지원합니다.
로직과 모델을 분리해서 작업하면 더 좋을 것 같습니다.

위와 같은 것을 이용한 TODO 샘플의 예제 입니다.

위와 같은 코드를 작성한 다음,

from flask import Flask
from flask_restplus import Api, Resource, fields

app = Flask(__name__)
api = Api(app, version='1.0', title='Sample API',
    description='A sample API',
)

@api.route('/my-resource/<id>')
@api.doc(params={'id': 'An ID'})
class MyResource(Resource):
    def get(self, id):
        return {}

    @api.response(403, 'Not Authorized')
    def post(self, id):
        api.abort(403)


if __name__ == '__main__':
    app.run(debug=True)

app.py로 저장합니다.

$ pip install flask-restplus
를 설치합니다. (Flask 등 필요한 것들이 모두 설치되는데 열개 정도 설치하는 것 같습니다)

$ python app.py

를 구동시키고,

http://localhost:500
에 브라우저로 접속하면,

위와 같이 나옵니다.

namespace 가 default로 되어 있어 default 인것 같은데, default를 선택하면 위와 같이 해당 메서드가 보이고,

상세 내용을 확인해 볼 수 있습니다.

restplus에서 좀 더 자세한 swagger ui 관련 내용을 보려면,



어느 분께는 도움이 되셨기를...

핑백

덧글

댓글 입력 영역

구글애드텍스트