Python Flask
flask란
flask는 파이썬의 가벼운 웹 프레임 워크로써, 주로 간단한 API를 만드는데 사용한다.
사용 방법
아래 예제 소스는 로컬 api 서버를 열어 “hello world!”를 리턴하는 예제다.
from flask import Flask
app = Flask(__name__)
@app.route('/test')
def test():
return "hello world!"
app.run()
flask 객체를 생성하여, @route 어노테이션을 사용하여 request를 받을 url(/test)을 설정하고 request를 받아 “hello world!”를 response해주는 예제로 실행 결과는 다음과 같다.
가장 간단한 사용법이다.
template
자주 사용하는 HTTP GET, POST 요청 예시다.
from flask_cors import CORS
from flask import Flask, request, jsonify
import json
app = Flask(__name__)
CORS(app)
@app.route('/test')
def test():
return "hello world!"
@app.route('/get-request')
def get_request():
print(request.args.to_dict()) # url 파라미터를 dict 형태로 출력
param1 = request.args.get("param1") # url 파라미터중 param1 파라미터의 값 받아옴.
return param1
@app.route('/post-request', methods=['POST'])
def post_request():
params = json.loads(request.get_data()) # encoding='utf-8' 파라미터를 넣어야 할 수도 있음.
print(params) # data로 넘어온 json 형태 데이터 출력
return "OK"
@app.route('/return-json')
def return_json():
param1 = request.args.get("param1")
return_data = {
"param1" : param1
}
return jsonify(return_data)
app.run(host="0.0.0.0")
request 파라미터 받기 /get-request
request로 들어오는 url 파라미터는 flask의 request모듈을 통해 처리한다. request.args를 통해 파라미터를 확인할 수 있다.
request.args.to_dict()로, 전체 파라미터를 dict 형태로 받아올 수 있고,
request.args.get("파라미터") 로 특정 파라미터값을 받아올 수 있다.
post request 처리 /post-request
post로 reqeust를 날릴때는 post 데이터를 주로 같이 날리게 된다. 이럴때 request로 넘어온 post data를 처리하는 방법이다.
request.get_data()를 통해 요청으로 넘어온 post 데이터를 확인할 수 있다.
params = json.loads(request.get_data())
json 형태로 리턴
함수에서 처리가 끝난 후 json 형태로 리턴해줄때 flask의 jsonify 함수를 사용하여 dict형태의 자료형을 json으로 만들어 리턴해준다.
jsonify(dict_data)
CORS
크로스 도메인은 웹상에서 자신과 다른 호스트로부터 온 리퀘스트를 사전에 차단하여 보안을 강화하는 목적으로 사용되지만,
개발시 api 서버와, 웹 호스팅 서버가 다른 경우 접속이 차단되는 경우가 생긴다.
ex) 웹서버는 localhost:8080으로 띄우고, api서버는 localhost:5000으로 띄울경우
localhost:8080 => localhost:5000 으로 도메인이 다르기 때문에 크로스 도메인으로 접속이 차단된다.
이를 해결해주기 위해 flask의 cors 모듈을 사용한다.
1. flask_cors 모듈 다운
pip3 install flask_cors
2. 모듈 사용
import flask_cors from CORS
app = flask(__name__)
CORS(app)
해당 방법을 통해 app 객체는 크로스 도메인 이슈에 저촉되지 않도록 설정한다.
run설정
flask 객체를 실행시키는 run에는 host, port등 다양한 설정이 가능하다. 그중 host 설정에 대해 알아본다.
192.168.0.x vs 127.0.0.1 vs localhost
세 주소 모두 나의 컴퓨터를 향하는 주소인건 맞지만 의미는 조금씩 다르다.
192.168.0.x
보통 public ip를 받아 private ip로 뿌려주는 NAT 공유기를 사용하게 되면 default로 잡히게 되는 게이트 웨이의 주소(공유기의 주소)는 192.168.0.1 이고 사설 네트워크 안에서 할당받는 주소는 192.168.0.1/24 범위로 할당받게 된다.
ifconfig, ipconfig를 통해 확인되는 inet 주소 192.168.0.x 는 해당 네트워크 대역대 (공유기 내부) 에서 나의 호스트를 지칭하는 주소다.
127.0.0.1
127.0.0.1은 루프백 주소 즉 호스트 자체에 할당된 IP이며 나 자신을 가리키는 주소다. 이 주소는 내가 나의 컴퓨터에 접속할때밖에 사용할 수 없다.
localhost
localhost는 컴퓨터 내부에서 127.0.0.1로 redirect된다. 우리가 인터넷창에 주소를 입력할때 www.google.com을 치면 dns를 통해 google의 ip로 변환되듯이 localhost는 127.0.0.1이라는 주소로 변경되어 리다이렉팅 된다.
flask.run(host=?)
run메소드의 host 파라미터는 listen을 할 호스트를 지정해주는 것이다.
여기서 host의 주소로 지정해주지 않을경우 default로 127.0.0.1을 사용하게 된다.
이때 동일한 호스트로 날리는 요청 즉 http://127.0.0.1:5000/test 에 대해서는 정상적으로 응답이 가능하다.
하지만 네트워크상에서 다른 호스트 -> 해당 호스트에 접근할경우 127.0.0.1이 아닌 private 주소든, public 주소든 다른 주소를 사용해 접속하게 되고, 이때 flask 객체가 listen할 호스트가 127.0.0.1이기 때문에 다른 호스트네임의 경우(ex 192.168.0.x)는 응답을 해주지 않는것이다.
host를 지정해주지 않을때
http://127.0.0.1:5000으로 접속 => listen host가 127.0.0.1이기 때문에 요청이 받아들여 진다.
http://192.168.0.x:5000으로 접속 => listen host가 127.0.0.1이기 때문에 접근 안됨.
이때는 run의 host파라미터, listen할 호스트네임을 192.168.0.x로 해주는 것이다.
이렇게 되면 로컬 네트워크 에서는 해당 서버 호스트에 192.168.0.x를 통해 접근이 가능하다.
하지만 이 경우에도 외부 인터넷에서 접근하는 접속은 접속되지 않는다. (포트포워딩이 정상적으로 되었다는 가정 하에) 이는 192.168.0.x 의 주소가 로컬 네트워크 에서만 유효하기 때문에 외부에서는 접근이 되지 않는것이다. 이때는 host=”0.0.0.0”으로 설정하여 모든 접속에 대해 접근이 가능하도록 설정해 준다.
대게 0.0.0.0, 0.0.0.0/0 은 모든 호스트를 의미한다.