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

Flaskで非同期フォーム送信(Ajax POST)を実装する方法を解説!初心者でもわかるステップ解説

Flaskで非同期フォーム送信(Ajax POST)を実装する方法を解説
Flaskで非同期フォーム送信(Ajax POST)を実装する方法を解説

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

生徒

「先生、Flaskでフォームを送信したら、ページをリロードせずに結果を表示したいんですけど、どうすればいいですか?」

先生

「それには“非同期通信”を使う方法があります。JavaScriptのAjax(エイジャックス)機能を使えば、Flaskとデータをやり取りしてもページを再読み込みする必要がなくなりますよ。」

生徒

「Ajaxって何ですか?難しそうな名前ですね…」

先生

「Ajaxは“非同期通信”という意味で、ブラウザとサーバーが裏側でデータをやり取りできる仕組みです。たとえば、Twitterで『いいね』ボタンを押してもページ全体はリロードされませんよね? あれもAjaxです。」

生徒

「なるほど!Flaskでも同じようにできるんですね!」

先生

「その通り!では、FlaskとAjaxを使ってフォームを非同期で送信する方法を実際に学んでみましょう!」

1. FlaskとAjaxを使うと何ができるの?

1. FlaskとAjaxを使うと何ができるの?
1. FlaskとAjaxを使うと何ができるの?

FlaskでAjaxを使うと、ページを再読み込みせずにサーバーとデータの送受信ができるようになります。 これにより、ユーザーが画面を操作するたびにページ全体が切り替わることなく、 必要な情報だけをその場で更新できます。 Webアプリがより快適に感じられる理由は、こうした非同期通信の仕組みにあります。

たとえば、フォームに名前を入力して「送信」ボタンを押した瞬間に、 画面の一部だけが切り替わり、 「こんにちは〇〇さん!」というメッセージがすぐ表示されるといった動きが可能です。 このとき、ブラウザは裏側でFlaskにデータを送信し、 結果だけを受け取って表示しています。

これは、サーバー(Flask)とブラウザ(JavaScript)がリアルタイムに通信している ために実現できる動きです。 ユーザーは通信を意識する必要がなく、 自然な操作感でWebアプリを利用できます。

Ajaxを使うメリットは次の通りです。

  • ページ全体をリロードしないので画面表示が速い
  • 入力途中の内容が消えず、操作がスムーズになる
  • 必要なデータだけを送受信でき、処理が効率的

まずは「ページを切り替えずに結果を表示できる」という点を理解するだけで十分です。 次のような非常に簡単なイメージを持っておくと、後の解説が分かりやすくなります。


// ボタンを押したらサーバーにデータを送るイメージ
fetch("/submit", {
    method: "POST",
    body: new FormData()
})
.then(response => response.json())
.then(data => {
    console.log(data);
});

このように、Ajaxを使うことで「クリック → すぐ結果表示」という流れを作ることができます。 FlaskとAjaxの組み合わせは、初心者でも扱いやすく、 動きのあるWebアプリを作るための第一歩としてとてもおすすめです。

2. Flask側の準備をしよう

2. Flask側の準備をしよう
2. Flask側の準備をしよう

ここでは、Ajaxから送られてくるフォームデータを受け取るための、 Flask側の基本的な準備を行います。 FlaskはとてもシンプルなWebフレームワークなので、 初心者でも少ないコードでサーバーを動かすことができます。 まずは「フォームのデータを受け取って、結果を返す役割がFlaskにある」 という点を押さえておきましょう。

Flaskがまだインストールされていない場合は、 ターミナルやコマンドプロンプトで次のコマンドを実行します。 これだけで、Flaskを使う準備は完了です。


pip install flask

次に、Flaskアプリの基本となるサーバーコードを作成します。 以下のコードでは、トップページを表示する処理と、 Ajax POSTで送られてきたフォームデータを受け取る処理を定義しています。 プログラミング未経験の方は、 「URLごとに処理を書く」というイメージを持つと理解しやすくなります。


from flask import Flask, request, jsonify, render_template

app = Flask(__name__)

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

@app.route("/submit", methods=["POST"])
def submit():
    name = request.form.get("name")
    message = f"{name}さん、フォームが正常に送信されました!"
    return jsonify({"result": message})

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

このコードでは、@app.routeという書き方で、 「どのURLにアクセスされたときに、どの処理を行うか」を指定しています。 "/"は最初に表示されるページ、 "/submit"はフォーム送信専用の受付窓口だと考えると分かりやすいでしょう。

ポイント解説:

  • request.form.get("name")は、 フォームに入力された内容を取り出すための命令です。 HTMLのname="name"と対応しています。
  • jsonify()を使うことで、 FlaskからJavaScriptへデータを分かりやすい形で返せます。 Ajax通信では、このJSON形式がよく使われます。
  • @app.route("/submit", methods=["POST"])は、 「POST通信だけを受け取る」という意味があり、 Ajaxフォーム送信に欠かせない設定です。

ここまで準備できれば、Flask側は「データを受け取って返す」役割をしっかり果たせます。 次のステップでは、このサーバーに対して、 ブラウザからAjaxでデータを送信する仕組みを作っていきます。

3. HTMLとJavaScriptでAjaxフォームを作る

3. HTMLとJavaScriptでAjaxフォームを作る
3. HTMLとJavaScriptでAjaxフォームを作る

ここでは、実際にブラウザ側で動くHTMLとJavaScriptを使って、 Ajaxによる非同期フォーム送信を実装します。 プログラミング未経験の方は、 「HTMLは画面を作る役割」「JavaScriptは動きをつける役割」 と考えると分かりやすいでしょう。 フォーム送信の流れを一つずつ確認しながら進めていきます。

まずは、ユーザーが名前を入力するためのフォームを用意し、 送信ボタンが押されたタイミングでJavaScriptが動くようにします。 この時点では、まだページ遷移は起きません。 JavaScriptが送信処理を横取りすることで、 非同期通信が可能になります。


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Flaskで非同期フォーム送信</title>
</head>
<body>
    <h1>FlaskとAjaxでフォーム送信!</h1>

    <form id="userForm">
        <input type="text" name="name" id="name" placeholder="名前を入力してください">
        <button type="submit">送信</button>
    </form>

    <p id="response"></p>

    <script>
        document.getElementById("userForm").addEventListener("submit", function(event) {
            event.preventDefault(); // ページのリロードを防ぐ

            const formData = new FormData(this);

            fetch("/submit", {
                method: "POST",
                body: formData
            })
            .then(response => response.json())
            .then(data => {
                document.getElementById("response").textContent = data.result;
            })
            .catch(error => console.error("エラー:", error));
        });
    </script>
</body>
</html>

このコードでは、フォームが送信された瞬間に submitイベントが発生し、 JavaScriptがその動きを制御しています。 fetch()を使うことで、 Flaskサーバーへデータを送信し、 返ってきた結果だけを画面に反映できます。

ここでのポイント:

  • event.preventDefault()は、 本来のフォーム送信動作を止めるために必須です。 これがないとページが再読み込みされてしまいます。
  • FormData(this)を使うと、 入力欄の内容をまとめて取得でき、 初心者でも簡単にデータ送信ができます。
  • fetch()はサーバーと通信するための命令で、 Ajax POSTを実現する中心的な役割を担います。
  • サーバーから返されたJSONデータを使って、 ページの一部だけを書き換えることで、 非同期通信らしい動きを実感できます。

4. 実行してみよう!FlaskとAjaxの連携確認

4. 実行してみよう!FlaskとAjaxの連携確認
4. 実行してみよう!FlaskとAjaxの連携確認

ここまで準備ができたら、実際にFlaskサーバーを起動して動作を確認してみましょう。 ターミナルやコマンドプロンプトでPythonファイルを実行し、 ブラウザから指定したURLにアクセスします。 画面が表示されたら、フォームに名前を入力して「送信」ボタンをクリックしてください。

すると、ページ全体は切り替わらず、 画面の下に次のようなメッセージだけが表示されます。 これは、JavaScriptが裏側でFlaskにデータを送信し、 返ってきた結果だけを画面に反映しているためです。


太郎さん、フォームが正常に送信されました!

入力内容を変えて再度送信しても、 ページがリロードされないことを確認できるでしょう。 この動きこそが、非同期通信(Ajax POST)の大きな特徴です。 ユーザーにとって待ち時間が少なく、 操作しやすい画面になることを実感できるはずです。

5. Ajax POSTの流れを図でイメージしよう

5. Ajax POSTの流れを図でイメージしよう
5. Ajax POSTの流れを図でイメージしよう

理解を深めるために、データの流れを簡単に整理してみましょう。

  1. ユーザーがフォームを送信する
  2. JavaScriptのAjaxがFlaskにPOSTリクエストを送る
  3. Flaskがデータを受け取り、処理を行う
  4. FlaskがJSON形式で結果を返す
  5. JavaScriptが結果を画面に表示する

このように、Ajaxを使うことで、ページをリロードせずにスムーズに情報を更新できるのです。

6. よくあるエラーと対処法

6. よくあるエラーと対処法
6. よくあるエラーと対処法

初心者がよくつまずくポイントも見ておきましょう。

  • フォーム送信後にページがリロードされる:
    event.preventDefault()が書かれているか確認しましょう。
  • Flaskがエラーを出す:
    @app.routeのURLとfetchのURLが一致しているか確認してください。
  • ブラウザがJSONを受け取れない:
    → Flask側でjsonify()を使ってJSONを返しているかチェックしましょう。

7. AjaxとFlaskを応用すると何ができる?

7. AjaxとFlaskを応用すると何ができる?
7. AjaxとFlaskを応用すると何ができる?

今回のようなフォーム送信以外にも、FlaskとAjaxを使えばさまざまなWebアプリを作ることができます。

  • リアルタイムコメント投稿機能
  • ページの一部だけを更新するダッシュボード
  • 自動保存フォーム
  • 投票・アンケートアプリ

つまり、FlaskとAjaxを理解すれば、より「動きのあるWebアプリ」を作れるようになります。

8. AjaxとFetch APIの違いも覚えておこう

8. AjaxとFetch APIの違いも覚えておこう
8. AjaxとFetch APIの違いも覚えておこう

実は、Ajaxは「考え方の名前」であり、Fetch APIはその実現方法のひとつです。 以前は「XMLHttpRequest(エックスエムエルエイチティーティーピーリクエスト)」という古い方法が使われていましたが、今ではFetch APIを使うのが主流です。

Fetch APIを使えば、より短いコードで同じことができるため、今後の学習ではFetch APIもあわせて覚えておくと良いでしょう。

まとめ

まとめ
まとめ

FlaskとAjaxによる非同期フォーム送信の全体像を振り返る

この記事では、Flaskを使ったWebアプリケーションにおいて、Ajaxを活用した非同期フォーム送信の仕組みを、 初心者にも分かりやすい形で段階的に解説してきました。 従来のフォーム送信では、送信ボタンを押すたびにページ全体が再読み込みされ、 ユーザーの操作が一時的に中断されてしまうという課題がありました。 しかし、FlaskとAjaxを組み合わせることで、この問題を解消し、 スムーズで直感的なユーザー体験を実現できます。

非同期通信を使う最大の特徴は、ページの一部だけを更新できる点にあります。 ブラウザとサーバーが裏側でデータをやり取りするため、 画面遷移を伴わずに結果を表示できます。 これは、フォーム送信だけでなく、コメント投稿、いいね機能、検索結果の即時表示など、 多くのWebサービスで使われている基本的な仕組みです。 Flaskでこの考え方を理解することは、実践的なWeb開発への大きな一歩となります。

Flask側の役割とAjax通信の関係

Flask側の処理では、フォームから送信されたデータを受け取り、 必要な処理を行ったうえでJSON形式のデータを返す役割を担っています。 今回の記事では、request.formを使ってフォームデータを取得し、 jsonify()で結果を返すという、非常に基本かつ重要な流れを学びました。 この仕組みを理解しておくことで、FlaskアプリとJavaScriptの連携が一気に分かりやすくなります。

また、URL設計やHTTPメソッドの指定も重要なポイントです。 Ajax POSTでは、データ送信にPOSTメソッドを使い、 Flask側でもmethods=["POST"]を正しく指定する必要があります。 クライアント側とサーバー側の設定が一致していないと、エラーの原因になるため、 両者の対応関係を意識しながら実装することが大切です。

JavaScriptとFetch APIで実現する非同期処理

フロントエンド側では、JavaScriptを使ってフォーム送信を制御し、 Fetch APIによってFlaskへリクエストを送信しました。 特に重要なのが、event.preventDefault()によるページリロードの防止です。 これがなければ、非同期通信を実装しても従来通りページが再読み込みされてしまいます。 この一行が、Ajaxフォームの動作を支える重要な役割を果たしています。

Fetch APIは、従来のAjax実装よりもシンプルで読みやすく、 初心者でも扱いやすい点が特徴です。 FlaskとFetch APIを組み合わせることで、 少ないコード量でも実用的な非同期フォーム送信を実現できます。 今回の例を応用すれば、入力チェックやエラーメッセージの即時表示なども簡単に追加できます。

基本を確認するためのシンプルな送信例

ここで、非同期フォーム送信の基本的な流れをもう一度整理するために、 最小構成の送信処理を振り返ってみましょう。 この形を理解しておけば、さまざまなAjax処理に応用できます。


fetch("/submit", {
    method: "POST",
    body: new FormData(document.getElementById("userForm"))
})
.then(response => response.json())
.then(data => {
    console.log(data.result);
});

このように、フォームの内容をそのまま送信し、 サーバーから返ってきたJSONデータを受け取って処理するだけで、 ページをリロードしないフォーム送信が完成します。 非同期通信の考え方を理解することで、 Flaskアプリの表現力は大きく広がります。

先生と生徒の振り返り会話

生徒

「Flaskでフォームを送信するときに、 どうしてページがリロードされなくなるのかが、やっと理解できました。 Ajaxって特別なものじゃなくて、仕組みを知ればシンプルですね。」

先生

「その通りです。 非同期通信は考え方をつかめば、とても便利な技術です。 FlaskとAjaxの役割分担が分かると、応用もしやすくなります。」

生徒

「フォーム送信だけでなく、 コメント投稿やリアルタイム更新にも使えそうですね。」

先生

「まさにその通りです。 今回学んだFlaskとAjaxの基礎は、 動きのあるWebアプリを作るための土台になります。 ぜひいろいろな機能に応用してみてください。」

カテゴリの一覧へ
新着記事
New1
Flask
FlaskでSQLインジェクションを防ぐ方法!初心者でもわかる安全なデータベース操作
New2
Django
Djangoプロジェクトのディレクトリ構造を完全解説!初心者でも迷わないフォルダの見方
New3
Flask
Flask×Flask-SocketIOでチャットアプリを作る流れを初心者向けにやさしく解説
New4
Flask
Flaskアプリの作り方を基礎から学ぼう!初心者が覚えるべき開発の流れとは?
人気記事
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で本番運用する方法!初心者でもわかるデプロイ構成の基本