python flask – 초간단 WEB API/함수
flask를 이용하면 단 몇 줄 만으로 웹 서비스를 생성해낼 수 있다.
설치
pip install flask
Hello World
아래와 같이 app
이라는 flask 인스턴스를 생성하고, decorator를 이용해서 /
경로에 GET
요청이 있을 때 ‘Hello Word!’ 라는 메시지를 뿌려주는 웹서버를 간단하게 생성해줄 수 있다.
# hello_world.py
import flask
app = flask.Flask(__name__)
app.config["DEBUG"] = True
@app.route('/', methods=['GET',])
def index():
return "Hello World!"
if __name__ == '__main__':
app.run(host='0.0.0.0',port='8888')
python hello_world.py
명령으로 실행한 뒤 curl -XGET $HOSTNAME:8888
요청을 보내면
Hello World!
위와 같이 응답을 받을 수 있다. 웹브라우저에 해당 경로로 접근해도 마찬가지.
Request Parameters
flask.request
를 이용하면 URI에 parameter를 추가하여, 요청 값에 따라 다른 응답을 받도록 설계할 수 있다.
앞서 크롤링한 lotto 데이터([Python] requests를 이용한 crawler – 로또 회차별 당첨 결과)를 활용한다. 아래와 같이 lotto 라는 변수에 해당 데이터를 로드한다.
import pickle
with open('lotto.bin','rb') as f:
lotto = pickle.load(f)
f.close()
웹 서버의 document root 바로 하위의 /win_result 에 접근했을 때에 수행할 작업을 다음과 같이 정의한다. 예를 들어 http://192.168.179.86:8888/win_result?round=47
이라는 요청을 한 경우, http://192.168.179.86:8888
이 root 경로이고, /win_result
는 하위 경로이면서 하나의 API 또는 Application이 된다. 그리고 해당 API에 input argument로서 ?round=47
이라는 값을 전달하게 된다.
다음은 ?round=x 라는 값을 입력받았을 때에 lotto 데이터(list 자료형)의 x 번째 값을 json 형태로 반환해주는 함수이다.
from flask import request
import json
@app.route('/win_result', methods=['GET',])
def win_result():
rnd = int(request.args['round'])
return json.dumps(lotto[rnd],indent=2)
한번에 다 써보면 다음과 같다.
# win_result.py
import flask
from flask import request
import pickle
import json
with open('lotto.bin','rb') as f:
lotto = pickle.load(f)
f.close()
app = flask.Flask(__name__)
app.config["DEBUG"] = True
@app.route('/win_result', methods=['GET',])
def win_result():
rnd = int(request.args['round'])
return json.dumps(lotto[rnd],indent=2)
if __name__ == '__main__':
app.run(host='0.0.0.0',port='8888')
python win_result.py
명령으로 실행하고 curl -XGET $HOSTNAME:8888/win_result?round=47
요청을 보내면 다음과 같은 응답을 받을 수 있다.
{
"round": 47,
"win result": {
"numbers": [
14,
17,
26,
31,
36,
45
],
"bonus": 27,
"win": {
"1st": {
"total amount": 16250212000,
"number of winners": 5
},
"2nd": {
"total amount": 2708368300,
"number of winners": 11
},
"3rd": {
"total amount": 2708345200,
"number of winners": 902
},
"4th": {
"total amount": 5413372000,
"number of winners": 40580
},
"5th": {
"total amount": 6794660000,
"number of winners": 679466
}
}
}
}
웹브라우저에서 http://$WEBSERVER_HOST:8888/win_result?round=47
경로에 접근해도 같은 결과를 받을 수 있다.