FlaskとFastAPIの違いは?同じメモ帳を両方で作って比べる|どっちから学ぶかの決め方
この記事は私のコースから特に需要が多い内容を抜き出して記事にしています。詳しく学びたい方はこちらからどうぞ。
「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 で行っています。
先に結論:違いは「画面を返す」か「データを返す」か

先に結論をまとめると、こうなります。
| 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

フォームに「電池を買う」と入れて「追加」を押すと、一覧に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

ブラウザで 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(追加できた)
- 空の 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 を開いてみてください。

書いた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のどれを選ぶか」の地図から始めるので、この記事の続きとして読めるはずです。
よくある疑問
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レッスン)からどうぞ。
→ 無料の入門コースを見る
こちらも読まれています
📚 関連商品・おすすめ書籍
※本記事にはアフィリエイトリンクが含まれます。




