[핵 쉬운] python, flask로 restful api 서버 만들기,

         

Flask(python) 사용해서
RESTful api서버 만들기


한동안 토이 프로젝트를 진행할 때, api서버는 항상 php를 이용해 만들었습니다. 예전에 안드로이드와 mysql을 php를 활용해 연동한 적이 있는데 이때 사용하던게 계속 연장되어서... 단순히 get과 post를 활용해 데이터를 주고받는 api를 만들때는 php로 뚝딱 만들었던것 같네요.


이번 긴~추석 연휴에 간단한 토이프로젝트를 하나 하려고하는데, php보다는 현재 공부하고있는 python을 활용해서 만들어보면 어떨까 생각했습니다. 게다가 요즘 restful 형식으로 만드는게 트랜드이다 보니 restful로 만들어보고싶기도 하구요.


일단 환경은 아래와 같습니다.


> MacOS

> Python3.6

> PyCham Editer

> InSomnia (restful request test tool)


Python을 이용해서 무언가를 만들때는 PyCham이 너무 좋은것 같습니다. 터미널에서 힘들게 pip으로 설치하지 않아도 몇번 클릭만으로 원하는 api다운받을 수 있고, 가상환경이나 코딩도 편합니다. 특히 터미널에서는 여러버전의 Python이 설치된 경우 환경설정이나 코딩에 불편함이 있었는데, PyCham을 쓰니 쉽게 관리가 되더라구요. 누가보면 JetBrain 직원인줄 ㅋㅋ


아무튼 PyCham으로 시작합니다!




PyCham에서 
Flask 프로젝트 만들기


PyCham을 실행하고 New Project를 만듭니다.



Flask Framework를 사용할 계획이니 Flask를 체크해주시고, 이름을 아무렇게나 만듭니다. 그리고 가상환경을 만들어줍니다. Python프로젝트에서 왜 가상환경을 사용하는지는 구글링해봅시다. 빨간 화살표있는 곳을 누르면 Create Virtualenv 메뉴가 있습니다.



가상환경의 이름을 만들고, Base interpreter를 설정합니다. 만들 가상환경이 어떤 버전의 Python을 참조할지 결정하는 메뉴입니다. 저는 Python3.6.1을 사용했습니다. 가급적이면 Python3을 씁시다!



Interpreter가 방금 생성한 가상환경으로 되있는지 확인하고 Creste를 눌러줍니다.

이제 기본적인 Flask 프로젝트가 만들어졌습니다.



이렇게 만든 flask프로젝트에 restful을 심어봅시다~!




Flask-Restful 환경 설정

Flask를 Restful하게 만들기 위한 패키지들을 다운받아봅시다.
메뉴에서 Preference에 들어가면 Project 메뉴가 있습니다. Project Interpreter메뉴를 선택하면 현재 프로젝트에 포함된 패키지 리스트를 볼 수 있습니다.



왼쪽 아래 조그만 +를 누르면 패키지를 추가할 수 있습니다. PyCham의 편리한 기능중에 하나입니다. 필요한 패키지를 검색해서 바로바로 설치할 수 있어요~ 터미널에서 열심히 명령어 칠 필요 없다능!



Flask-restful이라고 검색하면 맨위에 Flask-RESTful패키지가 나옵니다. 아래있는 Install Package를 누르면 설치가 됩니다. 참 쉽죠?

이제 아까 리스트에 Flask-RESTful 패키지가 설치된것을 확인 할 수 있습니다. 그 밖에 필요한 패키지도 자동으로 설치됩니다. 이제 실제로 코딩을 시작할 시간이군요. 


코드는 공식 홈페이지에 있는 Quick-Start 문서를 참고했습니다.

바로가기 - https://flask-restful.readthedocs.io/en/latest/quickstart.html


위에 Quick-Start 문서에서 보셔도 되고, 아래코드를 보고 코딩합시다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
from flask import Flask
from flask_restful import Resource, Api
 
app = Flask(__name__)
api = Api(app)
 
class RegistUser(Resource):
    def post(self):
        return {'result''ok'}
 
api.add_resource(RegistUser, '/user')
 
if __name__ == '__main__':
    app.run(debug=True)

cs


1~2 : 패키지를 선언합니다.

7~9 : 호출한 메서드를 만듭니다. 여기선 테스트로 post형식을 하나 만들었습니다.

11 : 실제로 URL과 메서드를 연결시켜주는 코드입니다. 


자 이제 프로젝트 Run을 해봅시다. 



아래 창에 위와같이 뜨면 성공입니다. 이제 Flask로 만든 RESTful api서버가 로컬에서 돌아가고 있습니다. 테스트를 해봐야겠지요?




Insomnia tool을 사용해서 
RESTful api 호출하기


구글에서 insomnia를 검색해서 설치합니다. window용도 있고 mac용도 있습니다.



일단 실행하면 위와 같은 화면입니다. 너무 심플해서 일단 당황..

New Request를 만들어줍니다.



Request의 이름을 정하고 호출형태를 정합니다. 아까 만든게 Post형식이기 때문에 Post로 만들어주고, 내용은 일단 빈값으로 No Body를 선택합니다. 



URL을 Localhost로 입력하고, 아까 만든 URL주소대로 /user를 입력합니다. Send를 눌러보면 주황색 박스에 결과가 나오는 것을 확인할 수 있습니다. 테스트 참 쉽네요~? 

Insomnia를 굳이 설치하지 않아도 curl이 설치되어있다면 terminal에서 간단하게 테스트 할 수 있습니다.





데이터를 담아서 호출하기

클라이언트에서 데이터를 담아서 온다면 어떻게 처리할까요? 간단하게 이름과 이메일주소를 담아서 호출하면 그값을 그대로 보여주는 기능을 만들어봅시다. 요청하는 형식은 아래와 같습니다.


    "name" : "홍길동" ,

    "email" : "hong@joseon.com"

}


넵 json형태입니다. name과 email의 값을 읽기 위해 아래와 같이 코딩해봅니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from flask import Flask
from flask_restful import Resource, Api
from flask_restful import reqparse
 
app = Flask(__name__)
api = Api(app)
class RegistUser(Resource):
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument('name', type=str)
        parser.add_argument('email', type=str)
        args = parser.parse_args()
 
        name = args['name']
        email = args['email']
 
 
        return {'name': name , 'email' : email}
 
api.add_resource(RegistUser, '/user')
 
if __name__ == '__main__':
    app.run(debug=True)

cs


3 : parser를 import합니다

9~12 : 클라이언트에서 넘어온 데이터를 파싱합니다. 

14~15 : 파싱한 데이터를 변수에 담습니다.

18 : 데이터를 리턴합니다.



이제 Insomnia로 다시 테스트를 해볼까요? 아까와 다른점은 전달하는 데이터가 있다는 점입니다.



화살표있는곳을 선택하면 body를 정할 수 있습니다. json으로 바꾼 뒤 데이터를 입력해서 Send를 누릅니다. 아까와 다르게 보낸 데이터를 그대로 리턴해주는 것을 확인할 수 있습니다.




마치며..

엄청 초 간단하게 RESTful api서버를 만들어봤습니다. 위에 예제로 만들어본것처럼 추가기능들에 대해 메서드를 만들고, url와 매핑해주면 됩니다. 실제 서버에서 실행시키고 외부에서 접속가능하게 하려면 마지막줄에 있는 app.run() 안에 host=0.0.0.0 옵션을 넣으시면 됩니다.


app.run(host = 0.0.0.0)


이제 이 서버에 이것저것 추가해 토이프로젝트를 진행하면 될 것같습니다. ^^

댓글(0)

Designed by JB FACTORY