본문 바로가기

Programming/Machine Learning

Flask 기본사용법

0. 모델 install

!pip install flask
!pip install werkzeug

 

1. Flask 모듈 임포트

from flask import Flask

 

2. Flask객체를 app에 할당

app = Flask(__name__)

 

3. app객체를 이용해 라우팅 경로를 설정

4. 해당 라우팅 경로로 요청이 올 때 실행할 함수를 바로 밑에 작성해야 함

@app.route("/hello")
def hello():                           
    return "<h1>Hello World!</h1>"

 

5. 메인 모듈로 실행될 때 플라스크 서버 구동 (서버로 구동한 IP 와 포트를 옵션으로 넣어줄 수 있음)

if __name__ == "__main__":
    from werkzeug.serving import run_simple
    run_simple('localhost', 9000, app)

 

Flask는 하나의 cell에 모든 코드가 있어야함.

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    
    return "<h1>Hello World!</h1>"

if __name__ == "__main__":
    from werkzeug.serving import run_simple
    run_simple('localhost', 9000, app)
    
"""실행시킨 후 http://localhost:9000/으로 접근하면 Hello world가 나옴"""

 

여러 웹 사이트 만들기

from flask import Flask

app = Flask(__name__)
@app.route("/")
def flask():                           
    return "<h1>Hello World!</h1>"

@app.route("/hello")
def hello():
    return "<h1>Hello Flash!</h1>"

@app.route("/first")
def first():
    return "<h3>Hello First</h3>"

if __name__ == "__main__":
    from werkzeug.serving import run_simple
    run_simple('localhost', 9000, app)
    
"""실행시킨 후 http://localhost:9000/ 주소로 접근가능"""
"""실행시킨 후 http://localhost:9000/hello 주소로 접근가능"""
"""실행시킨 후 http://localhost:9000/first 주소로 접근가능"""

 

URI를 변수로 사용

from flask import Flask

app = Flask(__name__)
@app.route("/")
def hello():                           
    return "<h1>Hello World!</h1>"

@app.route("/profile/<username>")
def get_profile(username):
    return "profile: " + username

@app.route("/first/<username>")
def get_first(username):
    return "<h3>Hello " + username + "!</h3>"

if __name__ == "__main__":
    from werkzeug.serving import run_simple
    run_simple('localhost', 9000, app)
    
"""실행시킨 후 http://localhost:9000/profile/MH 주소로 접근가능, MH는 변수명 아무거나 가능"""

 

다른 페이지로 데이터 전송

from flask import Flask, redirect, request

app = Flask(__name__)

"""get방식과 post방식으로 받을 수 있다."""
@app.route("/re", methods=['GET','POST']) 
def re():
    print(request.method)
    if request.method == 'POST':
        one_data = request.form['result']
    else:
        one_data = request.args.get('result')
    
    return "<h1>{}</h1>".format(one_data)

@app.route("/hello")
def hello():
    
    """쿼리스트링으로 전송"""
    return redirect("http://localhost:9000/request?result=123")

if __name__ == "__main__":
    from werkzeug.serving import run_simple
    run_simple('localhost', 9000, app)

 

Model 저장 및 로딩

from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
import pickle # 데이터 저장 모듈
iris = load_iris()

X = iris.data
y = iris.target

knn = KNeighborsClassifier()
knn.fit(X,y)
'''학습된 모델 저장'''
f = open('knn.pkl','wb')
pickle.dump(knn,f)
'''학습된 모델 로딩'''
f2 = open('knn.pkl','rb')
load_model = pickle.load(f2)
load_model.predict([[1,2,1,2]])

 

python dictionary to JSON

from json import JSONEncoder,JSONDecoder
dd = {'aa':0}
dd
json_str = JSONEncoder().encode(dd)
json_str

 

Ajax / cross domain 이슈 해결

from flask import Flask, redirect, request, Response

'''학습된 모델 로딩'''
app = Flask(__name__)
f2 = open('knn.pkl','rb')
load_model = pickle.load(f2)

@app.route("/re/<sw>/<sh>/<pw>/<ph>", methods=['POST']) 
def re(sw,sh,pw,ph):
    ## 모델 예측
    rs = load_model.predict([[sw,sh,pw,ph]])
    result_dic = {}
    result_dic['result'] = int(rs[0])
    resp = Response(JSONEncoder().encode(result_dic), 
                    mimetype='application/json')
    resp.headers['Access-Control-Allow-Origin'] = '*'
    resp.headers['Access-Control-Allow-Methods'] = 'POST'
    resp.headers['Access-Control-Allow-Headers'] = 'Origin'
    return resp

if __name__ == "__main__":
    from werkzeug.serving import run_simple
    run_simple('localhost', 9000, app)