[Python] Flask로 REST API 구현하기

    케라스(Keras)와 텐서플로우(Tensorflow)로 구현한 시퀀스투시퀀스(Seq2Seq) 모델로 챗봇을 구현하고 있는데 예전 tensorflow에서는 Java에서 tensorflow를 지원해서 호출하였지만 현재 tensorflow 2.0은 Java에서 호출이 지원되지 않는다. 이를 해결하기 위해 자바에서 모델을 호출하는 방식이 아닌 python에서 자체적으로 웹서버를 띄우기로 하였고, Flask 라이브러리를 사용하였다.

     

     

    라이브러리설치와 선언

    > pip install flask-restful

    (python) E:\Project\universe\source-python>pip install flask-restful
    Collecting flask-restful
      Downloading Flask_RESTful-0.3.8-py2.py3-none-any.whl (25 kB)
    Collecting aniso8601>=0.82
      Downloading aniso8601-8.0.0-py2.py3-none-any.whl (43 kB)
         |████████████████████████████████| 43 kB 286 kB/s
    Requirement already satisfied: pytz in c:\anaconda3\envs\python\lib\site-packages (from flask-restful) (2019.3)
    Requirement already satisfied: six>=1.3.0 in c:\anaconda3\envs\python\lib\site-packages (from flask-restful) (1.14.0)
    Collecting Flask>=0.8
      Downloading Flask-1.1.2-py2.py3-none-any.whl (94 kB)
         |████████████████████████████████| 94 kB 898 kB/s
    Requirement already satisfied: click>=5.1 in c:\anaconda3\envs\python\lib\site-packages (from Flask>=0.8->flask-restful) (7.1.2)
    Collecting Jinja2>=2.10.1
      Downloading Jinja2-2.11.2-py2.py3-none-any.whl (125 kB)
         |████████████████████████████████| 125 kB 6.4 MB/s
    Collecting itsdangerous>=0.24
      Downloading itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)
    Requirement already satisfied: Werkzeug>=0.15 in c:\anaconda3\envs\python\lib\site-packages (from Flask>=0.8->flask-restful) (1.0.0)
    Collecting MarkupSafe>=0.23
      Downloading MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl (16 kB)
    Installing collected packages: aniso8601, MarkupSafe, Jinja2, itsdangerous, Flask, flask-restful
    Successfully installed Flask-1.1.2 Jinja2-2.11.2 MarkupSafe-1.1.1 aniso8601-8.0.0 flask-restful-0.3.8 itsdangerous-1.1.0

    라이브러리를 모두 설치하였다면 아래와 같이 선언한다

    from flask import Flask
    from flask_restful import Resource, Api
    
    app = Flask(__name__)
    api = Api(app)
    
    @app.route('/chatbot/<chat>')
    def chatbot(chat):
        try:
            return {'status': 'success','request':chat}
        except Exception as e:
            return {'error': str(e)}
    
    if __name__ == '__main__':
        app.run(debug=True)

    코드 작성 후 파이썬을 실행하면

    C:\Anaconda3\envs\python\python.exe E:/Project/universe/source-python/friday/api.py
     * Serving Flask app "api" (lazy loading)
     * Environment: production
       WARNING: This is a development server. Do not use it in a production deployment.
       Use a production WSGI server instead.
     * Debug mode: on
     * Restarting with stat
     * Debugger is active!
     * Debugger PIN: 222-689-577
     * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

    이와같이 http://127.0.0.1:5000/ 아이피, 포트로 서버를 띄우게 된다.

     

     

    http://127.0.0.1:5000을 실행해보자

     

    not found 페이지

    그러면 다음과 같이 Not Found가 뜨는데 하위 경로를 안 적었기 때문이다 현재 chatbot이라는 함수에 route를 지정하였는데 http://127.0.0.1:5000/chatbot/테스트 라고 입력을 해보도록 한다

     

    {
    request: "테스트",
    status: "success"
    }

    다음과 같이 정상적으로 request와 status값이 나오는 JSON 결과를 볼 수 있게 되었다. flask에 model 등을 내재화해서 띄우려면, 모델을 로드하는 부분들은 전역 코드로 선언하고 최종적으로 값을 입력받아서 처리하는 부분만 def로 구현하여 app.route를 선언하면 된다.

     

    flask로 챗봇 api가 구동되고 있는 모습

     

    댓글

    Designed by JB FACTORY