[Python Flask] jQueryのAjax利用方法とサンプルコード

Flask
スポンサーリンク

こんにちは。
プログラミングを勉強しているロペです。

今日は、Vue.jsでのajax利用方法を勉強したので自分なりに纏め記事にしました。
サーバー側はPythonのFlaskを利用しています。

この記事がだれかの役にたったら幸いです。

スポンサーリンク

Ajaxとは

Ajaxを調べると以下のように表現されています。
(ちなみに、エイジャックスと読みます。最初はアジャックスかと思っていました。。。)

Ajaxとは、あるWebページを表示した状態のまま、別のページや再読込などを伴わずにWebサーバ側と通信を行い、動的に表示内容を変更する手法。ページ上でプログラムを実行できるプログラミング言語Javascriptの拡張機能を用いる。

IT用語辞典

Vue.jsはクライアント側(フロントエンド)のプログラムなので、Webサーバ側(バックエンド)とは通信できません。(ファイルを読み込んだり、データベースからデータを取り出したり、他のWebサイトにアクセスをして情報を得たりするのは、基本的にサーバー側(バックエンド)のプログラムでしか行えないのです)


そこで、「Ajax」を利用することで、クライアントのプログラムから、サーバーにアクセスして必要な情報を受け取れるようになります。

Ajaxの利用方法

Vue.jsを利用する方法は色々ありますが、jQueryにも組み込まれているので、今回はjQueryのAjax機能を利用することにしました。

JQueryのAjax機能でもっと簡単「get」を利用してみました。
書き方は以下になります(htmlに書きます)

$.get( アドレス , function( 引数 ){
受信後の処理
});

第一引数にはアクセスするアドレスを指定し、第二引数には、コールバック関数(通信完了後に呼び出される関数)を用意します。

注意点

一つ注意点があります(私はこれにハマってしまいました)

JQueryのAjaxを利用するため、JQueryを参照するタグを書いておく必要があります。
(よく考えたら当然ですが。。。)

以下のタグをHTMLに書いて参照すればOKです

<script src=”https://code.jquery.com/jquery-3.2.1.min.js”></script>

Ajaxを利用した実行画面

下の図のように、番号を選べるようにして、
番号に応じてFlask(サーバー側)からデータを取得します。

1番を選んだ結果

2番を選んだ結果

番号によって、出力される文字が変わっていることが分かると思います。
この出力されている文字は、Flask(サーバー側)に書いているコードになりますので、
Ajaxを利用してサーバー側からクライアント側にデータを持ってこれました!

次に、どのようなコードを実装したのか具体的に書いていきたいと思います。

サンプルコード

Flask(サーバー側)

from flask import Flask, render_template, request, session, url_for, redirect, jsonify
from flask.views import MethodView
import random

app = Flask(__name__)

@app.route('/', methods=['GET'])
def index5():
    return render_template('index4.html',\
        title='Vue.js',
       )


@app.route('/ajax/<id>', methods=['GET'])
def ajax(id):
    data = {
        1:{'id':1, 'name':'Taro', 'mail':'taro@yamada'},
        2:{'id':2, 'name':'Jiro', 'mail':'jiro@yamada'},
        3:{'id':3, 'name':'Saburo', 'mail':'saburo@yamada'}
    }
    n = int(id)
    if n < 1:
        n=1
    if n > len(data):
        n=3
    return jsonify(data[n]);

if __name__ == '__main__':
    app.debug=True
    app.run()

@app.route(‘/ajax/’, methods=[‘GET’])のところで、サーバー側にAjax用のAPIを追加しています。

/ajax/番号

にアクセスするとid,name,mailの情報が出力されるようにしています。
これをクライアント側から読み込むことで、実行画面の通りidに沿って、name、mailのデータをクライアント側で出力できます。

html(クライアント側)

ちょっと長くなりますが、全文貼っておきます。

{% extends "layout2.html" %}
{% block title %}
index3
{% endblock %}

{% block headline %}
{{title}}
{% endblock %}

{% block content %}
<div id="app" class="m-3">
    {% raw %}
    <mycomp/>
    {% endraw %}
</div>

{% raw %}
<script type="text/x-template" id="mycomp-template">
    <div>
        <div class="alert alert-info">
            <h5>{{title}}</h5>
            <p>{{data}}</p>
            <p>あなたが選択した番号: {{num}}</p>

        </div>
        <div>
            <select class="form-control" v-model="num"
                v-on:change="action">
            <option>1</option>
            <option>2</option>
            <option>3</option>
            </select>
        </div>
    </div>
</script>
{% endraw %}

<script>
// mycomp object
Vue.component('mycomp',{
    template:'#mycomp-template',
    data: function(){
        return{
            title:'This is sample of Ajax',
            data: '選択した番号に応じてFlask(サーバー側)からデータを取得します',
            num:0,
        }
    },
    methods:{
        action: function(){
            let self = this;
            $.get("/ajax/" + this.num, function(data) {
                self.data = data.id + ':' + data.name 
                + ' [' + data.mail + ']' ;
            });
        }
    }
});

// start Vue.
new Vue({
    el:'#app',
})
</script>
{% endblock %}
{% block footer %}
Coryright 2020 Rope_blog
{% endblock %}

methods:{
action: function(){
let self = this;
$.get(“/ajax/” + this.num, function(data) {
self.data = data.id + ‘:’ + data.name
+ ‘ [‘ + data.mail + ‘]’ ;
}

このコードで、Ajaxを利用してサーバー側からデータを取得しています。
(actionで、/ajax/番号にアクセスしてデータを取得しています)

$.getによって、

「”/ajax/” + this.num」という形でアクセス先のアドレスを指定して、コールバック関数にdataを指定することで、id,name,mailの値を取り出してテキストを作成し、変数dataに設定しています。

これによって、{{data}}部分が変化して画面出力できるよになります。

html(タグやレイアウト)

最後にタグやレイアウトを書いたhtmlの載せておきます。
{% extends “layout2.html” %}で参照している部分で、jQueryやVue.jsを参照するためのタグを書いています(このタグがないとhtmlでAjxaを利用することができません)

<!doctype html>
<html lang="ja">
<head>
    <title>{%block title %}{% endblock %}</title>
    <meta charset="utf-8"/>
    <meta name="vieport"
        content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <link rel="stylesheet" href="{{url_for('static',filename='style.css')}}">
            <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
            <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
            <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" ></script>
            <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
            <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
            <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
    </script> 
</head>
<body>
    <div class="test" style="background-color:rgba(169, 84, 177, 0.055);">
        <div class="target">
            <div class="container"style="max-width: 100%;">
                <div style="display: table;width:100%;">
                    <div style="display:table-cell; vertical-align:middle;font-size: 30px;">
                        <div class="text-left" style="border-bottom:5px solid rgb(135, 250, 196);" >
                        <h1 class="display-3">
                            <div style="font-size: 50px;">
                            {% block headline %}{% endblock %}
                            </div>
                        </h1>
                        </div>
                        <div style="border-bottom:5px solid rgb(135, 250, 196);" >
                            {% block content %}{% endblock %}
                        </div>

                        <div class="text-right">
                        {% block footer %}{% endblock %}
                        </div>
                    </div>
                </div>
            </div>
        </div>   
    </div>
</body>
</html>

以上になります!

コメント

タイトルとURLをコピーしました