【CGI】Vue.js + axios로 서버의 Python 프로그램을 움직여 출력 데이터를 받는다

소개



프런트 엔드로 전부 할 수 있을 수 있지만, 역시 계산 부분에 Python의 즐거움은 갖고 싶다, 라는 생각으로부터 서버로 프로그램을 동적으로 움직이는 CGI를 만져 보았으므로 그 정리. 백엔드는 아직 희소하다.

무료 대여 서버의 XREA 계정을 가지고 있기 때문에 실제로 거기에서 시도해보십시오.
무료로 사용할 수있는 고기능 · 고품질 렌탈 서버 | XREA (엑스리아)

하고 싶은 것은
  • 버튼 클릭
  • Vue.js와 axios를 사용하여 데이터를 서버에 전달합니다.
  • Python으로 작성된 CGI 스크립트를 실행하여 연산, 결과를 JSON으로 반환
  • 같은 화면에 반환된 데이터 표시

  • 라는 감자.

    이번에는 예로서 입력된 2수의 최대 공약수와 최소 공배수를 계산해 돌려주는 프로그램을 만든다.

    만들어 보자



    파일 배치


    ├─ cgi-bin
    │    └─ index.cgi
    ├─ index.html
    └─ main.js
    

    파이썬으로 작성된 CGI 스크립트는 cgi-bin라는 디렉토리를 만들어 그 안에 투입. 파이썬으로 작성되었지만 확장자는 .cgi
    서버에 업로드한 후, CGI 주위의 퍼미션을 지정할 필요가 있지만 그것은 후술.

    HTML(index.html)


    <html>
    <head>
        <meta charset="UTF-8">
        <title>最大公約数と最小公倍数を返す</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/axios.min.js"></script>
        <script type="module" src="main.js"></script>
    </head>
    <body>
        <div id="app">
            <!-- 入力部分 -->
            <p>
                <input v-model="a" type="number" value="12">
                <input v-model="b" type="number" value="15">
                <button v-on:click="getResult">計算</button>
            </p>
            <!-- 表示部分 -->
            <p>
                最大公約数: {{ result['gcd'] }}<br>
                最小公倍数: {{ result['lcm'] }}
            </p>
        </div>
    </body>
    </html>
    

    CDN에서 Vue.js와 axios를 로드하십시오.
    Vue로 쓴 JavaScript 파일은 type="module" 로 읽으면 DOM이 로드된 후에 실행되므로 안심.

    JavaScript (main.js)


    var vm = new Vue({
        el: '#app',
        data: {
            a: 12,
            b: 15,
            result: {},  // 返ってきたオブジェクトを格納する変数
        },
        methods: {
            getResult: function() {
                const url = './cgi-bin/';
                // axiosでデータの受け渡し
                axios.get(url, {
                    params: {  // paramsでパラメータを指定
                        a: this.a,
                        b: this.b
                    }
                })
                .then(res => this.result = res.data)  // データをresultに格納
            }
        }
    });
    

    Vue 인스턴스를 만들고 axios에서 데이터를 전달합니다.
    URL은 ./cgi-bin/ . index.cgi 라는 이름이라면 HTML처럼 파일명을 지정하지 않아도 OK인 것 같다.

    또, 돌려주는 데이터 res.data 는 오브젝트로서 꺼낼 수 있으므로 JSON.parse() 라든가로 고칠 필요가 없었다. (JSON으로 돌려주었으니까 JSON 문자열로 되돌아올 것이라고 하는 생각이 들었다.)
    덧붙여서 하면 이런 에러가 나온다.
    SyntaxError: Unexpected token o in JSON at position 1
    
    o 라고 뭐라고 생각하면 objecto

    파이썬 CGI (index.cgi)


    #!/usr/local/bin/python3
    # -*- coding: UTF-8 -*-
    import cgi
    import cgitb
    import math
    import json
    
    cgitb.enable()  # CGIのデバッグをオン
    
    form = cgi.FieldStorage()  # GETで得たデータを格納
    a = int(form['a'].value)   # データは文字列でやってくるので数値に変換
    b = int(form['b'].value)
    
    data = {
        'gcd': math.gcd(a, b),  # math.gcd() は Python 3.5 で追加されたらしい
        'lcm': a * b // math.gcd(a, b)
    }
    
    print('Content-Type: application/json')
    print()
    print(json.dumps(data))  # json形式にして返す
    

    선두에서 Python 인터프리터의 위치를 ​​지정. 렌탈 서버의 사양 페이지에 각 언어의 CGI의 실행 패스가 쓰여 있다고 생각하므로 확인한다. XREA라고 여기.

    Context-Type 지정의 행의 뒤의 print() 는 개행을 위해서, 이것을 넣지 않으면 안되는 사양 같다. 보통 Context-Type 문자열의 끝에 \n 그래도 OK.

    업로드 후는 CGI 스크립트를 넣은 디렉토리와 그 파일의 퍼미션을 지정할 필요가 있어, XREA에도 추천 퍼미션이 쓰여 있다.

    특히, CGI 실행 파일은 700 이상(실행 가능)이어야 하는 것은 주의(잘 잊었다).

    이상의 XREA의 사양이 써 있는 링크도 붙여 둔다.
    사양 | 무료로 사용할 수있는 고기능 · 고품질 렌탈 서버 | XREA (엑스리아)

    실행



    파일을 올리고 실제로 시도한 화면이 여기

    좋은 감자. 공란이나 소수로 송신하면 보통에 에러가 되지만, 뭐 시험이므로.

    이상.

    좋은 웹페이지 즐겨찾기