カテゴリ: Flask 更新日: 2025/12/06

Flaskでフォームを送信せずに部分更新する方法を解説!初心者でもわかるDOM更新と非同期通信

Flaskでフォームを送信せず部分更新する仕組みを解説(DOM更新)
Flaskでフォームを送信せず部分更新する仕組みを解説(DOM更新)

先生と生徒の会話形式で理解しよう

生徒

「先生、Flaskでフォームを送信したらページが全部リロードされるんですけど、送信せずに一部分だけ更新することってできますか?」

先生

「とても良いところに気づきましたね。Flaskでは、JavaScriptと連携することでページ全体をリロードせず、必要な部分だけを更新することができますよ。」

生徒

「どうやってそんなことができるんですか?」

先生

「それには『非同期通信(ひどうきつうしん)』という仕組みを使います。英語では “AJAX” や “Fetch API” と呼ばれるものです。フォームを送信せずに、サーバーとデータをやり取りして、画面の一部分だけを更新する方法を一緒に学んでいきましょう。」

1. Flaskとフロントエンドの部分更新とは?

1. Flaskとフロントエンドの部分更新とは?
1. Flaskとフロントエンドの部分更新とは?

通常、Flask(フラスク)でフォームを送信すると、ブラウザ全体がリロードされて、サーバーから新しいHTMLページが再表示されます。ですが、ユーザーにとっては画面がチカチカして見にくく、操作も遅く感じてしまいます。

そこで登場するのが「非同期通信」と「DOM(ドム)更新」です。DOMとは、ブラウザがページを理解するために作る“ページの構造のデータ”のことです。これをJavaScriptで直接書き換えることで、ページを丸ごと再読み込みしなくても部分的に更新できるのです。

たとえば、コメント欄に「送信」ボタンを押したら、ページ全体を再読み込みせずにコメントだけを追加することができます。これが「部分更新」です。

2. Flask側(サーバー側)の準備

2. Flask側(サーバー側)の準備
2. Flask側(サーバー側)の準備

まずはFlaskのサーバー側で、フォームから送られてくるデータを受け取り、結果をJSON形式(データをテキストで表現する軽量なフォーマット)で返すようにします。


from flask import Flask, request, jsonify, render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/add_comment', methods=['POST'])
def add_comment():
    data = request.get_json()
    comment = data.get('comment')
    new_comment = f"あなたのコメント: {comment}"
    return jsonify({'comment': new_comment})

ここではrequest.get_json()を使って、JavaScriptから送られてくるJSONデータを受け取ります。そして、返すときもjsonify()でJSONとして返しています。これにより、ブラウザ側で受け取ったデータを使って動的にDOMを更新できるようになります。

3. フロントエンド側(HTML+JavaScript)の作成

3. フロントエンド側(HTML+JavaScript)の作成
3. フロントエンド側(HTML+JavaScript)の作成

次に、フォームを送信せずにFlaskと通信するHTMLとJavaScriptを作りましょう。


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Flask 部分更新の例</title>
</head>
<body class="container py-4">
    <h2>コメントを追加</h2>
    <form id="commentForm">
        <input type="text" id="commentInput" placeholder="コメントを入力" class="form-control mb-2">
        <button type="submit" class="btn btn-primary">送信</button>
    </form>

    <h3 class="mt-4">コメント一覧</h3>
    <div id="commentList"></div>

    <script>
        const form = document.getElementById("commentForm");
        const input = document.getElementById("commentInput");
        const list = document.getElementById("commentList");

        form.addEventListener("submit", async function(e) {
            e.preventDefault(); // ページの再読み込みを止める
            const commentText = input.value;

            const response = await fetch("/add_comment", {
                method: "POST",
                headers: { "Content-Type": "application/json" },
                body: JSON.stringify({ comment: commentText })
            });

            const data = await response.json();
            const newDiv = document.createElement("div");
            newDiv.textContent = data.comment;
            list.appendChild(newDiv);

            input.value = ""; // 入力欄をリセット
        });
    </script>
</body>
</html>

このコードでは、フォームを送信してもページ全体をリロードしません。代わりにJavaScriptのfetch()を使ってFlaskにデータを送信し、結果を受け取ってDOMを直接更新しています。

appendChild()は、HTMLの要素を追加するための関数です。新しいコメントを受け取るたびに、コメント一覧に追加されていく仕組みになっています。

4. 部分更新の流れを理解しよう

4. 部分更新の流れを理解しよう
4. 部分更新の流れを理解しよう

ここまでをまとめると、FlaskとJavaScriptの連携による「部分更新(DOM操作)」の流れは次の通りです。

  1. ユーザーがコメントを入力して送信ボタンを押す。
  2. JavaScriptがフォームのデータをFlaskにJSON形式で送る(fetch関数)。
  3. Flaskが受け取って処理し、結果をJSONで返す。
  4. JavaScriptが返ってきたデータを読み取り、HTMLの一部(DOM)を書き換える。

このように「ページ全体をリロードしないでデータを更新する仕組み」は、今のWebアプリケーションの基本です。TwitterやInstagramなども同じ仕組みで動いており、画面の一部だけをスムーズに変えています。

5. エラー処理も加えてみよう

5. エラー処理も加えてみよう
5. エラー処理も加えてみよう

実際のアプリでは、通信に失敗した場合や、サーバーでエラーが起きた場合もあります。そのため、エラーが出たときの処理も書いておくとより安定したアプリになります。


<script>
form.addEventListener("submit", async function(e) {
    e.preventDefault();
    const commentText = input.value.trim();
    if (!commentText) {
        alert("コメントを入力してください。");
        return;
    }
    try {
        const response = await fetch("/add_comment", {
            method: "POST",
            headers: { "Content-Type": "application/json" },
            body: JSON.stringify({ comment: commentText })
        });

        if (!response.ok) {
            throw new Error("通信エラーが発生しました。");
        }

        const data = await response.json();
        const newDiv = document.createElement("div");
        newDiv.textContent = data.comment;
        list.appendChild(newDiv);
        input.value = "";
    } catch (error) {
        alert(error.message);
    }
});
</script>

このようにtry...catch構文を使うことで、通信中に問題が起きてもユーザーに分かりやすくエラーメッセージを出すことができます。

6. 実際の動作イメージ

6. 実際の動作イメージ
6. 実際の動作イメージ

これを実行すると、コメントを入力して「送信」ボタンを押した瞬間に、ページ全体をリロードせずにコメントが下に追加されます。FlaskとJavaScriptの連携によって、スムーズでストレスのないユーザー体験を作ることができるのです。

このような技術は「シングルページアプリケーション(SPA)」の基礎でもあり、Flaskを使ったフロントエンド連携の第一歩となります。

カテゴリの一覧へ
新着記事
New1
Django
Djangoプロジェクトのディレクトリ構造を完全解説!初心者でも迷わないフォルダの見方
New2
Flask
Flask×Flask-SocketIOでチャットアプリを作る流れを初心者向けにやさしく解説
New3
Flask
Flaskアプリの作り方を基礎から学ぼう!初心者が覚えるべき開発の流れとは?
New4
Flask
Flask-WTFでファイルアップロードフォームを完全ガイド!初心者でもわかる画像やPDFのアップロード方法
人気記事
No.1
Java&Spring記事人気No1
Django
Django環境構築の全手順を完全解説!初心者でも迷わないPython・Djangoセットアップガイド
No.2
Java&Spring記事人気No2
Flask
Flask-Loginでユーザー認証を完全ガイド!初心者でもわかるログイン処理の作り方
No.3
Java&Spring記事人気No3
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.4
Java&Spring記事人気No4
Python
PythonでHello Worldを表示するには?初心者向けに最初の1行を実行してみよう
No.5
Java&Spring記事人気No5
Python
Pythonで定数を定義する方法!変更されない変数の書き方と命名ルールを初心者向けに解説
No.6
Java&Spring記事人気No6
Python
Pythonでリストを文字列に変換する方法を完全ガイド!初心者でもわかるjoinの使い方
No.7
Java&Spring記事人気No7
Python
Pythonのmatch文(パターンマッチング)とは?switch文の代替としての使い方をやさしく解説
No.8
Java&Spring記事人気No8
Flask
FlaskアプリをNginx + Gunicornで本番運用する方法!初心者でもわかるデプロイ構成の基本