Old Branch

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

woolbro 2020. 8. 19. 11:30
반응형

이전 글 첨부

[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

[Master_branch/develop_branch] - Vue.js & Flask - 데이터 주고받기 (axios)

 

Vue에서 생성한 button과 function을 바인딩 해 보도록 하려고 한다

깃허브 소스는 링크로 첨부한다 → 링크

Vue-Flask Data Binding

이전의 글에서 axios로 front와 back을 연동했다.

axios를 가지고 backend와 frontend에서 데이터를 서로 연동을 해 주었는데 이번에는 list 데이터를 받아 출력하고, 출력 해 주는 이벤트를 button에 할당 해 주려고 한다.

backend - route추가

backend/app.py 수정

이전의 파일에서 핑크색으로 된 부분을 추가했다 → 랜덤으로 생성되는 데이터를 출력 해준다.

from flask import Flask, jsonify
from flask_cors import CORS

from my_util.my_logger import my_logger

import os,string

# 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')

@app.route('/main_btn',methods=['GET'])
def main_btn():
    my_logger.info("click Main Btn")
    data = []
    string_pool = string.ascii_lowercase
    result_dict={}

    for i in range(15):
        result_val=''

        for i in range(10):
            import random
            result_val += random.choice(string_pool)

        result_dict['key'] = result_val

        data.append(result_dict)

    return jsonify(data)

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

frontend - Dashboard.vue수정

frontend/src/views/Dashboard.vue - html 업데이트

  • 어느 곳 이던지 상관이 없다. 나는 이전의 버튼과 연동할 것이기 떄문에 버튼 바로 밑에 추가 해 주었다
<div class="col-md-12">
    <h1>My Test</h1>
    <button type="button" class="btn btn-success btn-sm">{{my_data}}</button>
    <hr>
    **<ul>
        <li v-for="(msg,index) in ran_str" :key="index">
            {{ msg.key }}
        </li>
    </ul>**
</div>
  • v-for으로 list에 데이터를 추가 해 준다

frontend/src/views/Dashboard.vue - javascript 업데이트

  • export default에 추가 해 주었다
...

data() {
    return {
        ...
        ran_str: [],
                ...
        },
},
...
methods:{
    ...
    getRanStr(){
          let path = "http://" + window.location.hostname + ":5000/main_btn";
          axios.get(path).then((res) => {
              this.ran_str = res.data;
              console.log(res.data);
          }).catch((error) => {
              console.error(error);
          });

      },
    ...
},
...
  • 페이지가 로딩되며 바로 실행 할 것이 아니기 때문에 created에 추가 해 주지 않았다.

이제 다시 button으로 돌아가서 getRanStr() 함수를 할당 해 주려고 한다.

<button type="button" class="btn btn-success btn-sm" v-on:click="getRanStr">{{my_data}}</button>
  • v-on:click 으로 함수 할당을 해준다

run!!

$ docker-compose up --build