영감을 (inspire) 주고픈 개발 블로그

밑바닥부터 만드는 웹 서비스 -2 flask를 이용해 rest api 서버 구축 본문

시리즈/웹 페이지 만들기

밑바닥부터 만드는 웹 서비스 -2 flask를 이용해 rest api 서버 구축

inspire12 2018. 6. 23. 20:16

개요

우선 기본적인 flask 를 통해 rest api 의 get, post, put, delete 를 구현하고 사용자 요청을 받는 방법과 요청을 받아 DB에 접근해서 데이터를 가져오는 것까지 해보자


세팅

backend/app.py 

from flask import Flask
from flask_cors import CORS
from flask_restplus import Resource, Api, reqparse

app = Flask(__name__)
CORS(app)
title = 'my homepage'
api = Api(app=app)


class HealthCheck(Resource):

def get(self):
'''
사용자가 보낸 parameter를 통해
데이터를 보내줍니다.
:return:
'''
return {'msg': 'get ok'}

def post(self):
'''
사용자가 보낸 session 정보를 통해
수정 역할을 합니다.
:return: 수정 여부를 반환합니다.
'''
return {'msg': 'post ok'}

def put(self):
'''
사용자가 보낸 데이터를 저장한다.
:return:
'''
return {'msg': 'put ok'}

def delete(self):
'''
데이터를 삭제한다.
:return:
'''
return {'msg': 'delete ok'}


api.add_resource(HealthCheck, '/v0.0/test')

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

실행 해보면 


예시 하나로 get 을 실행해보면 (Mac 과 Windows 조금 달라요)


response body를 보면 우리가 설정한 return 값이 나오는 걸 알 수 있습니다. 


위의 curl 이 요청을 보낸 명령어로 이를 터미널에서 하면 같이 받을 수 있는 걸 볼 수 있습니다. 혹은 Postman 같은 프로그램을 통해 확인할 수 있습니다.

그래도 시각적으로 처리하는 게 처리하기 쉬우니까 저는 flask 의 swagger를 쓰겠습니다. 


각 기능들 기본 틀 만들기 

공식 레퍼런스 참고 : http://flask-restful.readthedocs.io/en/0.3.5/quickstart.html

블로그 참고 : https://medium.com/@feedbots/python-flask-%EB%A1%9C-%EA%B0%84%EB%8B%A8%ED%95%9C-rest-api-%EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0-60a29a9ebd8c


우선 db 에서 데이터를 가져오기 전에 클래스 내에 object를 만들고 다뤄봅시다. 

클래스 안에 하나 만들었습니다. 

class HealthCheck(Resource):
# 이 데이터를 수정하면서 해봅시다.
test_object = {
'_id_inspire12': {
'user_id': 'inspire12',
'user_name': 'flask_user',
'board':
[{
'content_id': 1,
'title': 'hi'
},
{
'content_id': 2,
'title': 'hi'
}]
}
}

Get 

 : header 의 url 을 파싱해서 받는 부분이 필요합니다.  reqpase 객체를 활용합니다. 

@api.doc('')
@api.param('user_id', '')
def get(self):
'''
사용자가 보낸 parameter를 통해
데이터를 보내줍니다.
:return:
'''
# parameter 를 받습니다.
param_list = ['user_id']
parser = reqparse.RequestParser()
for param in param_list:
parser.add_argument(param)
query = parser.parse_args()
# 제대로 parameter를 받았는지 debug를 위해
print('_id_{}'.format(query['user_id']))

# return 데이터를 받아놓습니다.
res = self.test_object.get('_id_{}'.format(query['user_id']))
# 데이터, 반응, 헤더 로 구성
return res, HTTPStatus.OK, {}

Post 

: body 의 json 오브젝트를 받습니다. 

@api.doc('')
@api.param('body', '', 'body')
def post(self):
'''
사용자가 보낸 session 정보를 통해
수정 역할을 합니다.
:return: 수정 여부를 반환합니다.
'''
data = request.get_json(silent=True, force=True)
# 데이터 확인
print(data)


return data

Post 의 경우 body 형식으로 전송해야하는데 

flask swagger에서 전달이 안되네요.. 

그래서 postman 으로 확인했습니다.. 



put 의 경우  post 방식으로 하고 


delete 의 경우 get 방식으로 하면 됩니다.


다음 포스팅에 

 post와 put, delete 를 db와 연결해서 구현해보겠습니다. 

 

추가적으로 

 API관리와 로직 분리(의존성) 위해 코드를 정리하고 몽고 db를 통해 db 를 구성봅시다.


  그 이후 angular 를 통해 프론트엔드 부분을 처리하겠습니다.