Old Branch

Vue.js & Flask - 데이터 주고받기 (axios)

woolbro 2020. 8. 18. 16:57
반응형

이전글 첨부

[Master_branch/develop_branch] - Vue.js & Flask - 개발환경구축하기

[Master_branch/develop_branch] - Vue.js & Flask - 컴포넌트와 api 연동(1) - backend

[Master_branch/develop_branch] - Vue.js & Flask - 컴포넌트와 api 연동(2) - frontend

 

 

Dockerfile과 docker-compose를 사용해서 작성 된 frontend / backend 를 올렸다.

이제 frontend ←→ backend가 서로 통신이 되는지, 데이터를 주고 받을 수 있는지 확인 해 보려고 한다.

 

소스 파일은 여기에 있다 -->Github Soruce

docker-compose 개발환경 시작

이전에 작성 했었었던 docker-compose로 세팅한 개발환경을 실행 해 주어서 실시간으로 변경 되는 것을 보려고 한다.

$ docker-compsoe up --build

flask의 주소로 데이터 받아 올 수 있는 환경 구성하기

데이터의 구성과 추적을 위해서 도커에 올라가있는 플라스크 서버에 logging 남기는 설정을 해 주도록 해야겠다.

.
├── app.py
├── back.dev.Dockerfile
├── my_util
│   ├── __init__.py
│   └── my_logger.py
└── requirements.txt

위의 폴더 구조처럼, my_util 패키지를 만들어 주고, init.py 와 my_logger.py를 작성 했다

# backend/my_util/my_logger.py

import logging

"""
    Set Default Formatter
"""
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d:%H:%M:%S')

"""
    Set My Loogger
"""

my_logger = logging.getLogger('MY_FLASK_LOG')
my_logger.setLevel(logging.DEBUG)
stream_log = logging.StreamHandler()
stream_log.setFormatter(formatter)
my_logger.addHandler(stream_log)
# 로그 disabled
# my_logger.disabled = True

이제 작성을 했으니 작성 했거나, 작성 할 route에 적용을 시켜 주도록 해야겠다

app.py에 모든 것을 넣어 주었으니 작성한 my_logger도 넣어주어야겠다

from flask import Flask, jsonify
from flask_cors import CORS

from my_util.my_logger import my_logger

import os

# instantiate the app
app = Flask(__name__)

# enable CORS
CORS(app, resources={r'/*': {'origins': '*'}})

# sanity check route
@app.route('/', methods=['GET'])
def test_router():
    my_logger.info("hello this is root url!")
    return jsonify('This is Docker Test developments Server!')

@app.route('/health_check', methods=['GET'])
def health_check():
    my_logger.info("health check route url!")
    return jsonify('good')

if __name__ == '__main__':
    app.run(host='0.0.0.0',port=os.getenv('FLASK_RUN_PORT'),debug=os.getenv('FLASK_DEBUG'))

수정이 되었으니

  • localhost:5000/health_check로 접속을 해보면 화면에는 'good'이 출력이 되고, docker log에는 작성 해 준 텍스트가 나올 것이다.

      my-back     |  * Detected change in '/www/app.py', reloading
      my-back     |  * Restarting with stat
      my-back     |  * Debugger is active!
      my-back     |  * Debugger PIN: 185-026-892
      my-back     | 2020-07-27:02:13:08 - MY_FLASK_LOG - INFO - health check route url!
      my-back     | 172.22.0.1 - - [27/Jul/2020 02:13:08] "GET /health_check HTTP/1.1" 200 -

Vue에서 flask서버로 요청을 보내 응답받기

위의 flask 서버에서 localhost:5000/localhost:5000/health_check 두 개를 활용 해 보도록 하겠다.

front폴더의 src 아래에 있는 Dashboard.vue를 수정 하려고 한다.

  • 연동되는 vue의 페이지를 보기 위해서는 router.js를 보는것이 좋은데, 가장 기본적으로 연동되어있는 페이지가 Dashboard.vue 이기 때문에 수정 해 보려고 한다.
frond/src
├── App.vue
├── assets
├── components
├── directives
├── layout
├── main.js
├── plugins
├── registerServiceWorker.js
├── router.js
└── views
    ├── Dashboard
    **├── Dashboard.vue**
    ├── Icons.vue
    ├── Login.vue
    ├── Maps.vue
    ├── Register.vue
    ├── Tables
    ├── Tables.vue
    └── UserProfile.vue

axios 활용하여 데이터 주고받기

vue에서 데이터를 주고받을 방법으로 axios를 사용하려고 한다.

docker파일을 내려주고, 아래의 명령어로 axios를 다운받은 후 다시 실행 시켜준다

$ yarn add axios #front 폴더에서
$ docker-compose up --build #front폴더 밖에서

이제 그럼 axios를 사용 가능하다.

Dashboard.vue를 수정 해 주도록 하겠다.

front/src/views/Dashboard.vue

// axios
import axios from 'axios';

...
data() {
    return {
        my_data: '',
        ...
    }
},
methods:{
    ...
    getMyData(){
      let path = "http://" + window.location.hostname + ":5000/";
      axios.get(path).then((res) => {
          this.my_data = res.data;
      }).catch((error) => {
          console.error(error);
      });
  },
    ...
},
created() {
    this.getMyData();
},
  • axios를 사용하기 위해서 axios import
  • method : 사용할 함수를 만들어 준다. 이 때 플라스크서버에 요청 → axios
  • created : 어떤 함수를 실행 시킬 것인지

그리고 이제 getMyData() 를 통해 가져온 데이터를 my_data에 저장을 해 주었으니, 사용을 해 주어야 한다. 나는 맨 위에 구분 할 수 있는 텍스트와 버튼을 만들어 주고, my_data를 출력 해 주었다.

<div class="row">
    <div class="col-md-12">
        <h1>My Test</h1>
        <button type="button" class="btn btn-success btn-sm">{{my_data}}</button>
        <hr>
            ...
            ...
    </div>
</div>

화면을 확인 해보면, 가장 위에 localhost:5000/ 에 해당하는 텍스트로 데이터가 만들어 진 것을 확인 할 수있다.

다음번에는 페이지 하나를 따로 만들어 봐야겠다.