この記事は私のコースから特に需要が多い内容を抜き出して記事にしています。詳しく学びたい方はこちらからどうぞ。

「PythonでWebアプリを作りたいけど、FlaskとFastAPI、どっちを選べばいいの?」「検索すると『FastAPIは速い』『Flaskは定番』と出てくるけど、結局なにが違うのか分からない…」

こんなふうに迷っていませんか? 名前は似ていますし、どちらも「Pythonで書いたWebの仕組み」を作る道具なので、最初は違いが見えにくいですよね。

この記事では、同じ「メモ帳」をFlaskとFastAPIの両方で作って、実際に動かして比べます。コードを並べてみると、違いは「速さ」よりも「何を返すのが得意か」にあることが、はっきり見えてきます。

対象は、Pythonの入門(変数・if・for・リスト・辞書・関数)をひと通り終えた方です。この記事で分かることはこちら👇

  • FlaskとFastAPIの、いちばん大きな違い(画面を返すか、データを返すか)
  • 同じメモ帳を両方で書くと、コードのどこが変わるか
  • 入力チェックの書き方の違い(自分で書く/型で宣言する)
  • FastAPIの説明書ページ(/docs)が自動でできる様子
  • 目的別に「どっちから学ぶか」の決め方

動作確認は Python 3.13・Flask 3.1.3・FastAPI 0.143.1・uvicorn 0.54.0 で行っています。

先に結論:違いは「画面を返す」か「データを返す」か

web application laptop
web application laptop / Photo by Pixabay via Pexels

先に結論をまとめると、こうなります。

Flask FastAPI
得意なもの ブラウザに画面(HTML)を返すWebアプリ ほかのプログラムにデータ(JSON)を返すAPI
使う人 人がブラウザで開いて、ボタンやフォームで操作する スマホアプリ・画面のJavaScript・別のサービスが呼び出す
入力チェック 自分で if を書く 型(Pydantic)で宣言すると自動でチェック
説明書のページ なし(必要なら自分で書く) /docs に自動でできる
起動 flask --app app run uvicorn main:app

イメージとしては、Flaskは「お店の店員さん」、FastAPIは「倉庫の受付窓口」です。店員さんはお客さん(人)に商品を見せながら対応し、受付窓口は伝票(決まった形のデータ)でやりとりします。

もちろん、Flaskでもデータを返すAPIは作れますし、FastAPIでも画面は返せます。違いは「何が最初から楽にできるか」です。では、実際に作って確かめてみましょう!

準備:FlaskとFastAPIを入れる

新しいフォルダを作り、仮想環境を有効にしたターミナルで、使う道具をまとめて入れます(requests は、あとでFastAPIにデータを送るために使います)。

pip install flask fastapi uvicorn requests

Flask版:ブラウザで開くメモ帳

まずはFlaskです。app.py という名前で保存します。メモの一覧を表示して、フォームから追加できる画面です。

from flask import Flask, redirect, render_template_string, request, url_for

app = Flask(__name__)
memos = ["牛乳を買う"]  # 練習用:サーバーを止めると消えます

PAGE = """<!doctype html>
<html lang="ja">
<head><meta charset="utf-8"><title>メモ帳</title></head>
<body>
  <h1>メモ帳(Flask)</h1>
  <ul>
    {% for memo in memos %}<li>{{ memo }}</li>{% endfor %}
  </ul>
  <form method="post" action="{{ url_for('add') }}">
    <input name="text" placeholder="メモを入力">
    <button>追加</button>
  </form>
</body>
</html>"""


@app.route("/")
def index():
    return render_template_string(PAGE, memos=memos)


@app.route("/add", methods=["POST"])
def add():
    text = request.form.get("text", "").strip()
    if not text:  # 入力チェックは自分で書く
        return "メモが空です", 400
    memos.append(text)
    return redirect(url_for("index"))

ここが重要です👇

  • @app.route("/") は「/ を開いたら、すぐ下の関数を動かす」という意味。URLと関数をつなぐ書き方です。フォームの送り先は methods=["POST"] を付けて「POSTで送られてきたときだけ」にしています
  • 関数が返しているのは HTML(画面)。render_template_string が {{ memo }} の場所にメモを入れてくれます
  • フォームの送り先 /add では、空のメモを 自分で書いた if で弾いています
  • 追加したら redirect で一覧に戻ります(再読み込みで二重に追加されるのを防ぐ定番の形です)

HTMLを文字列でコードの中に書いているのは、1ファイルで試せるようにするためです。本格的に作るときは templates フォルダにHTMLのファイルを分けます。

起動して、ブラウザで http://127.0.0.1:5000 を開いてみましょう。

flask --app app run
Flask版のメモ帳。フォームから追加すると一覧に1行増える
Flask版のメモ帳。フォームから追加すると一覧に1行増える

フォームに「電池を買う」と入れて「追加」を押すと、一覧に1行増えます(上の画像は、別の方法で「卵を買う」も追加したあとの画面です)。人がブラウザで使う画面が、Pythonだけで作れました😊

FastAPI版:データを返すメモ帳

次はFastAPIです。別のフォルダ(または同じフォルダ)に main.py として保存します。

from fastapi import FastAPI
from pydantic import BaseModel, Field

app = FastAPI()
memos = ["牛乳を買う"]  # 練習用:サーバーを止めると消えます


class Memo(BaseModel):
    text: str = Field(min_length=1)  # 入力チェックは「型」で宣言する


@app.get("/memos")
def list_memos():
    return memos


@app.post("/memos", status_code=201)
def add_memo(memo: Memo):
    memos.append(memo.text)
    return {"text": memo.text, "count": len(memos)}

ポイントをまとめるとこんな感じです。

  • URLと関数をつなぐ書き方はFlaskとよく似ている。FastAPIでは @app.get・@app.post のように、GETとPOSTを書き分けます(Flaskの @app.route(..., methods=["POST"]) にあたります)
  • 関数がリストや辞書を return すると、FastAPIが JSON(データ)にして返してくれる
  • class Memo(BaseModel) で「送ってくるデータは、text という1文字以上の文字列」と型で宣言している。Flask版の if にあたるチェックを、ここで済ませています
  • status_code=201 は「新しく作りました」という意味の番号です

起動は uvicorn(ユービコーン)というサーバーで行います。

uvicorn main:app
uvicornで起動したときの表示
uvicornで起動したときの表示

ブラウザで http://127.0.0.1:8000/memos を開くと、画面ではなく ["牛乳を買う"] というデータだけが表示されます。FastAPIのメモ帳は、人が見る画面ではなく、ほかのプログラムが読むためのものだからです。

入力チェックの違いを実際に試す

FastAPIのメモ帳は、ブラウザのフォームではなく、プログラムからデータを送って使います。uvicornを起動したまま、別のターミナルで次の try_api.py を実行してみましょう。正しいデータ・空のデータ・名前を間違えたデータの3つを送ります。

これ、実行せずに結果を予想できますか? 2つ目と3つ目は、main.py に if を1行も書いていないのに、どうなるでしょう。

import requests

url = "http://127.0.0.1:8000/memos"

r = requests.post(url, json={"text": "卵を買う"})
print(r.status_code, r.json())

r = requests.post(url, json={"text": ""})
print(r.status_code, r.json()["detail"][0]["msg"])

r = requests.post(url, json={"title": "卵を買う"})
print(r.status_code, r.json()["detail"][0]["msg"])
実行結果:正しいデータは201、空や名前違いは422で断られる
実行結果:正しいデータは201、空や名前違いは422で断られる

実行結果は上の画像のとおりです。

  • 正しいデータは 201(追加できた)
  • 空の text は 422 と「String should have at least 1 character(1文字以上にしてください)」
  • text が無いデータは 422 と「Field required(text が必要です)」

つまり、型を宣言しただけで、間違ったデータは関数に届く前に断られるわけです。Flask版では同じことを if で自分で書きました(空のメモには 400 と「メモが空です」を返します)。入力の項目が増えるほど、この差は大きくなります。

FastAPIは説明書(/docs)が自動でできる

もう1つ、FastAPIならではの便利な機能があります。uvicornを起動したまま、ブラウザで http://127.0.0.1:8000/docs を開いてみてください。

FastAPIが自動で作る説明書のページ(/docs)
FastAPIが自動で作る説明書のページ(/docs)

書いた2つの関数(GET /memos と POST /memos)が、説明書のページとして自動で並びます。それぞれを開いて「Try it out」を押すと、このページから実際にデータを送って試せます。APIを使う側の人(スマホアプリを作る人など)に「このURLにこの形で送ってね」と伝える手間が、ほぼなくなるわけです。

Flaskにはこの機能は付いていません。そのかわりFlaskには、画面を組み立てるテンプレート(Jinja2)や、ログイン状態を覚えておくセッションが最初から入っていて、人が操作する画面のアプリを作るのに向いています。

結局どっちから学ぶ?目的別の決め方

ここまでの違いをふまえると、選び方はシンプルです。

作りたいもの 先に学ぶなら
社内の申請・貸し出し表・記録帳のような、人がブラウザで使うアプリ Flask
ログイン・フォーム・一覧と詳細のページがあるアプリ Flask
スマホアプリや画面のJavaScriptから呼ぶデータの窓口 FastAPI
AIのモデルや自作の処理を、ほかのプログラムから呼べるようにしたい FastAPI
管理画面つきの大きなサービスを、チームで作る Django(FlaskかFastAPIで仕組みをつかんでからでも遅くない)

迷ったら、「完成したものを、人が画面で触るのか、プログラムが呼ぶのか」で決めてください。

そして安心してほしいのは、どちらから始めても無駄にならないことです。今回のコードを見比べたとおり、「URLと関数をつなぐ」「入力をチェックする」「データを保存する」「テストを書く」という考え方は共通です。片方を作れるようになれば、もう片方は「書き方の違い」を覚えるだけで進めます。

筆者は、この2つを別々の講座にしています。Flaskの講座では読書記録アプリを、ログイン・データベース・テストまで。FastAPIの講座では単語帳のAPIを、データベース・テスト・画面のJavaScriptから呼び出すところまで、一から作ります。どちらも最初に「Flask・FastAPI・Djangoのどれを選ぶか」の地図から始めるので、この記事の続きとして読めるはずです。

→ 「作って学ぶFlask・FastAPI入門」の紹介を見る

よくある疑問

FastAPIのほうが速いなら、FastAPIだけ覚えればいい?

FastAPIは「速い」と紹介されることが多いですが、社内ツールや個人のアプリで、その差に困ることはまずありません。それよりも「画面を作るのか、データの窓口を作るのか」のほうが、作りやすさに大きく効きます。速さで選ぶより、作りたいもので選びましょう。

Flaskで作った画面から、データだけを返すこともできる?

できます。Flaskでも関数が辞書を return すれば JSON が返ります。ただし、入力チェックや説明書のページは自分で用意することになります。APIが中心になるなら、最初からFastAPIを選ぶほうが手間は少なくなります。

HTMLを知らないとFlaskは難しい?

画面の見た目(HTMLやCSS)は、いまはAIに頼めばかなり整ったものを作ってくれます。大事なのは、送られてきた入力をどう受け取り、どう保存し、誰に見せるかというサーバー側の処理です。HTMLは「タグで囲むと見た目が決まる」くらいの理解から始めて大丈夫ですよ。

まとめ

  • Flaskは画面(HTML)を返すWebアプリ、FastAPIはデータ(JSON)を返すAPIが得意
  • URLと関数をつなぐ書き方はほぼ同じ。違うのは「何を return するか」
  • 入力チェックは、Flaskは if で自分で書き、FastAPIは型で宣言すると自動で 422 を返す
  • FastAPIは /docs に説明書のページが自動でできる
  • 迷ったら「人が画面で触るか、プログラムが呼ぶか」で決める。どちらから始めても考え方は共通

同じメモ帳を2つの書き方で作ってみると、「むずかしそう」が「できそう」に変わるはずです。ぜひ手を動かして試してみてください!🚀

\ Webアプリを一から作ってみたい方へ /

筆者は、Pythonの入門を終えた人向けに、Webアプリを作りながら学ぶ講座を2つ公開しています。「作って学ぶFlask Webアプリ入門」では読書記録アプリを、ログイン・データベース・テストまで。「作って学ぶFastAPI入門」では単語帳のAPIを作ります。どちらも、同じネットワークのスマホから使う方法と、AIが書いたコードを見直すチェックリストまで扱います。

→ 「作って学ぶFlask・FastAPI入門」の紹介を見る

Pythonの文法に不安がある方は、先に無料の入門コース「作って学ぶPythonプログラミング入門」(全7章52レッスン)からどうぞ。
→ 無料の入門コースを見る

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る
徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る
実践Claude Code入門―現場で活用するためのAIコーディングの思考法

もしも

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

AIコーディングの現場活用法を学ぶ一冊

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。