간단한 API 호출을 위한 웹 서버가 필요해서 flask
프레임워크를 사용해 구축하려고 한다. Spring, PHP, nodejs, django 등 많은 프레임워크가 있고 쓸 수도 있겠지만 두 가지 이유에서 flask를 선택했다. 간단하고 빠르게 개발이 가능하고 파이썬 언어를 사용하기 때문이다. 혼자서 개발하고 규모도 크지 않아 적절한 선택이라고 생각한다. flask로 직접 개발해본적은 없지만 쉽게 원하는 기능을 만들 수 있을것 같다.
개발 환경은 ubuntu16.04LTS
, python3.6
으로 진행했다.
모듈 설치
flask도 파이썬 모듈이기 때문에 pip
로 설치 가능하다.
pip install flask
앱 생성
app.py
파일을 만들고 코드를 작성한다.
x
from flask import Flask
app = Flask(__name__)
route("/") .
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
xxxxxxxxxx
python app.py
app.run()
을 호출해서 서버를 실행한다.- 라우팅은
@app.route("*")
처럼 데코레이터 형태로 구현 가능하다.
위 코드를 실행하면 아래와 같이 창이 생성된다.
라우팅
라우팅 구현에 대해 더 상세히 확인해보려 한다. 여러 기능을 수행하는데 필요한 기능이다.
route('/user') .
def user():
return 'user page...'
@app.route()
에 경로를 추가해준다. 지정한 경로로 접속할 경우 해당 함수가 호출된다.
xxxxxxxxxx
route('/user/<user_name>/<int:user_id>') .
def user_info(user_name, user_id):
return f'name : {user_name}, id : {user_id}'
- 슬래시(/) 다음에
<>
변수를 지정하고 동일한 이름의 변수를 파라미터에 준다.int:{변수이름}
식으로 타입도 지정할 수 있다.
Request
HTTP 프로토콜을 최대한 활용하기 위해 REST API 형태로 구성한다. 이를 통해 GET
, POST
, PUT
, DELETE
같은 요청 메소드에 따라 여러 기능을 구분해 개발한다. 각 요청 메소드를 flask에서는 어떻게 처리하는지 봤다.
x
# ...
from flask import request
route('/student', methods=['GET']) .
def student_get():
stduent_name = request.args.get('name')
return f"Get Request! {stduent_name}"
route('/student', methods=ㄴ['POST']) .
def student_post():
student = request.args.get('name')
student = request.form['name']
return "Post Request!"
app.route
의 methods 인자에GET
,POST
,PUT
,DELETE
를 지정해 처리할 메소드를 선택한다. 배열 형태로 전달되기 때문에 한 함수로 여러 타입의 메소드를 처리할 수 있다.request
모듈을 통해 요청 파라미터를 가져온다.- GET의 경우 URL의 뒤에
?key1=value1&key2=value2
형태로 파라미터가 전달된다. 이 파라미터들을request.args
를 통해 가져온다. - POST의 경우
request.form
을 통해form
타입으로 전송된 요청 파라미터를 받는다. - POST 요청을 보낼때도 GET처럼 URL의 뒤에 요청 파라미터를 받을 수 있다. 이 때도 동일하게
request.args
를 사용한다.
- GET의 경우 URL의 뒤에
JSON
요청에 JSON 타입을 보내는 경우 아래와 같이 처리할 수 있다.
xxxxxxxxxx
route('/student/json', methods = ['POST']) .
def student_json():
values = request.get_json()
print(values)
return values
request.get_json()
을 통해 요청의 body에 들어있는 json 값을 가져온다.
Response
클라이언트에서 요청을 보내면 서버에서는 그에 따른 응답 메시지를 보낸다. 클라이언트에 보내는 내용은 HTML 페이지, 문자열, JSON, 파일 등 다양하다. HTML 파일과 JSON 응답을 보내는 방법은 아래와 같다.
HTML
정적 파일들은 프로젝트 디렉토리 안에 templates
라는 폴더 안에 생성한다. html, css, js 파일들을 여기에 넣어줘야 한다.
x
├── templates
│ ├── css
│ │ └── style.css
│ ├── js
│ │ └── main.js
│ └ index.html
└── app.py # 플라스크 앱 파일
위처럼 정적 파일을 구성한다.
x
from flask import Flask, render_templates # render_templates 추가
# ...
route("/") .
def hello():
return render_templates("index.html")
# ...
render_templates
함수로 html 파일을 지정한다.
JSON
flask 모듈에 jsonify
함수를 사용하면 간단히 JSON 형태의 응답을 보낼 수 있다.
xxxxxxxxxx
route("/json") .
def json_res():
data = {
"name": "Tom",
"age": 18,
"grade": 3.6
}
return jsonify(data)
# return jsonify(name="Tom", age=18, grade=3.6) # 동일한 결과
- 파이썬의 dictionary 자료형을
jsonify
에 전달하면 JSON 응답을 만들 수 있다. jsonify
의 인자로key=value
를 전달하는 방식으로도 응답을 생성할 수 있다.
위 내용들을 확인하면 간단히 서버 구축이 가능할 것 같다.