Web APIを最短で形にしたいPython初心者の方に向けて、Flaskを使った最小構成のAPIをゼロから作り、手元で動かし、そしてインターネットに公開するまでを一気に駆け抜けます。
必要なのはPythonとpipだけです。
寄り道せず、動くものを最短で積み上げていきます。
Flaskで最短のWeb API入門(Python初心者向け)
Flaskとは?軽量フレームワークの基本
Flaskは軽量で拡張しやすいPythonのWebフレームワークです。
最低限の機能(ルーティング、リクエスト処理、レスポンス作成)から始められ、必要に応じてライブラリを追加できます。
学習コストが低く、小さなWeb APIを短時間で構築したい場合に最適です。
本記事ではテンプレートやデータベースは扱わず、APIに特化して進めます。
今回のゴール(Hello Worldから公開まで)
- ローカルで動く最小のFlask APIを作成(Hello WorldのJSONを返す)
- GETとPOSTの基本エンドポイントを追加
- ブラウザやcurlで動作確認
- 短時間で外部公開(ngrok)
- 無料PaaS(Render)での最小デプロイ
最終的に、自分の端末から世界へ公開できる状態まで到達します。
必要環境(Python3・pipのみ)
以下があれば十分です。
エディタはお好みでかまいません。
項目 | 必須 | 推奨バージョン | 確認コマンド | 備考 |
---|---|---|---|---|
Python | はい | 3.10以上 | python –version または python3 –version | OS標準でも可 |
pip | はい | 最新 | pip –version | Pythonに付属 |
Git(GitHub) | 任意 | 最新 | git –version | Renderへデプロイ時に便利 |
ngrok | 任意 | 最新 | ngrok version | 一時公開に使用 |
まずは手元で動かし、次に公開という順で進めます。
開発準備とインストール
Pythonとpipの確認方法
お使いの環境でPythonとpipが使えるか確認します。
Windowsではpy
コマンドでも実行できます。
# macOS/Linuxの例
python3 --version
pip3 --version
# Windowsの例
python --version
pip --version
Python 3.12.5
pip 24.2 from .../site-packages/pip (python 3.12)
仮想環境(venv)の作り方
プロジェクトごとに依存関係を分離するため、仮想環境を使うことを強く推奨します。
# プロジェクト用のフォルダを作成して移動
mkdir flask-hello && cd flask-hello
# 仮想環境を作成(.venvという名前にします)
python -m venv .venv
# 仮想環境を有効化
# macOS/Linux (bash/zsh)
source .venv/bin/activate
# Windows (PowerShell)
. .venv\Scripts\Activate.ps1
# 有効化に成功するとプロンプトに(.venv)が表示されます
(.venv) user@machine flask-hello %
Flaskのインストール(pip install flask)
仮想環境が有効な状態でFlaskをインストールします。
pip install flask
pip show flask # バージョン確認
Name: Flask
Version: 3.0.0
Summary: A simple framework for building complex web applications.
...
必要なら依存関係を保存しておきます。
pip freeze > requirements.txt
Flask==3.0.0
itsdangerous==2.2.0
Jinja2==3.1.4
Werkzeug==3.0.3
...
最小のプロジェクト構成
最低限はapp.py
だけで始められます。
後でRenderにデプロイするためrequirements.txt
も用意しておくと便利です。
flask-hello/
├─ .venv/ # 仮想環境(そのまま)
├─ app.py # Flaskアプリ本体
└─ requirements.txt # 依存パッケージ(任意)
Hello WorldなFlask Web APIの作り方
最小のapp.pyを作成
まずはJSONでHello Worldを返すエンドポイントを作ります。
# app.py
# 最小のFlask Web API。JSONでHello Worldを返します。
from flask import Flask, jsonify, request
# Flaskアプリを作成
app = Flask(__name__)
# ルート(/)にアクセスされたときにJSONを返すエンドポイントを定義
@app.get("/") # GETメソッド専用のショートカット(Flask 2.0+)
def root():
# dictをそのまま返しても自動的にJSON化されます
return {"message": "Hello, World!"}
# スクリプトとして直接実行したときだけ開発用サーバーを起動
if __name__ == "__main__":
# debug=Trueにするとコード変更を自動リロードしてくれます
app.run(debug=True)
この状態ではブラウザからhttp://127.0.0.1:5000/
にアクセスするとHello, World!のJSONが見られるようになります。

ルーティング(@app.route)の基本
ルーティングは@app.route("/path", methods=["GET", "POST"])
のように定義します。
Flask 2.0以降は@app.get
や@app.post
などのショートカットが使えます。
パスパラメータも簡単です。
# app.py に追記例
# /hello/<name> のようにパスパラメータを受け取る
@app.get("/hello/<name>")
def hello_name(name):
# 受け取ったnameを使って挨拶を返す
return {"message": f"Hello, {name}!"}
このエンドポイントは/hello/Alice
のようにアクセスできます。

JSONレスポンスの返し方
Flaskでは辞書を返すと自動でJSONに変換されますが、ステータスコードやヘッダーを細かく制御したいときはjsonify
が便利です。
from flask import jsonify
@app.get("/status")
def status():
data = {"ok": True, "service": "flask-hello"}
# ステータスコード201(Created)で返す例
return jsonify(data), 201
{
"ok": true,
"service": "flask-hello"
}

実行方法(flask run)と停止
開発中はflask
コマンドが便利です。
環境変数を設定せず、–appオプションで起動できます。
# デバッグモードで起動(自動リロード)
flask --app app --debug run
* Serving Flask app 'app'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
* Restarting with stat
停止はCtrl + C
です。
動作確認(ブラウザ・curl)
ブラウザでhttp://127.0.0.1:5000/
にアクセスするほか、curlでAPIの動作を確認できます。
# ルートパスの確認
curl -s http://127.0.0.1:5000/
# パスパラメータの確認
curl -s http://127.0.0.1:5000/hello/Alice
{"message":"Hello, World!"}
{"message":"Hello, Alice!"}
GET/POSTエンドポイントを追加
実用の一歩として、クエリ文字列を受け取るGETと、JSONを受け取るPOSTを追加します。
# app.py に追記
from flask import abort
@app.get("/echo")
def echo():
# /echo?name=Alice のようにクエリ文字列から取得
name = request.args.get("name", "Anonymous")
return {"echo": name}
@app.post("/sum")
def sum_numbers():
# Content-Type: application/json を期待
data = request.get_json(silent=True)
if not data:
# 不正なJSONやContent-Typeで400を返す
return {"error": "invalid JSON"}, 400
a = data.get("a")
b = data.get("b")
# 型チェック(数値でなければ400)
if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
return {"error": "a and b must be numbers"}, 400
return {"a": a, "b": b, "sum": a + b}
# GETの確認
curl -s "http://127.0.0.1:5000/echo?name=Flask"
# POSTの確認(JSONでaとbを渡す)
curl -s -X POST http://127.0.0.1:5000/sum \
-H "Content-Type: application/json" \
-d '{"a": 12, "b": 30.5}'
{"echo":"Flask"}
{"a":12,"b":30.5,"sum":42.5}
受け付けるデータの検証は本来重要です。
厳密なバリデーションが必要な場合はPydanticなどを使う方法もあります(本記事では扱いません)。
公開(デプロイ)の最短手順
開発サーバーと本番の違い(概要)
Flaskの開発サーバーはデバッグと学習用です。
高負荷やセキュリティを想定しておらず、インターネットに直接公開してはいけません。
本番はGunicornなどのプロダクション向けWSGIサーバーでアプリを動かします。
簡易公開にはngrokを使い、恒久公開はRenderなどのPaaSを使うのが手早いです。
0.0.0.0で起動して外部公開
同一ネットワーク内の別端末からアクセスしたい場合は、0.0.0.0
で待ち受けます。
# 例: ポート5000で全インターフェースを待ち受け
flask --app app run --host 0.0.0.0 --port 5000
* Running on http://0.0.0.0:5000 (Press CTRL+C to quit)
この場合、自分のPCのローカルIPアドレス(例: 192.168.1.23)を使って、別端末からhttp://192.168.1.23:5000/
にアクセスできます。
ルーター越しのインターネット公開には向きません(ポート解放やNATの問題があるため)。
ngrokで一時的に公開する
ngrokはローカルのポートを安全に外部へトンネル公開します。
デモや動作確認に最適です。
# ngrokをインストール済みとします(未インストールなら公式手順で導入)
# ローカルの5000番ポート(Flask)をインターネットへ公開
ngrok http 5000
ngrok
Session Status online
Account your-account
Version 3.x
Web Interface http://127.0.0.1:4040
Forwarding https://random-subdomain.ngrok-free.app -> http://localhost:5000
表示されたhttps://...ngrok-free.app
にアクセスすると、インターネット経由であなたのFlaskアプリに到達できます。
終了はCtrl + C
です。
Renderで無料デプロイ(最小構成)
恒久的に公開する最短ルートの一つがRenderの無料プランです。
プラン名 | 月額費用 (ユーザーあたり) | 主な特徴・含まれる内容 |
---|---|---|
Hobby | $0 | 個人プロジェクト、小規模アプリ向け。 サービスの起動などに応じてコンピュート費用別途。ワークスペースは 1 プロジェクト・環境。 帯域 (Bandwidth)100 GB/月含む。 無料で公開する場合はこのプラン。 |
Professional | $19 | 本番アプリを運用するチーム向け。帯域 500 GB/月。 チームメンバーなどの制限緩和。 プレビュー環境・プライベートリンクなど。 |
Organization | $29 | 高トラフィック、多めのコンプライアンス要件向け。 ユーザー管理・監査ログ・アクセス制御等の強化。 帯域 1 TB/月含む。 |
Enterprise | カスタム見積もり | より厳しい SLA/セキュリティ/パフォーマンスが必要な大規模組織向け。専用サポート・契約条件など個別対応。 |
GitHub連携で自動デプロイできます。
1. ファイルを用意
最低限、以下の2ファイルをGitHubリポジトリに置きます。
app.py
requirements.txt
# app.py(ローカル開発と同じでOK。Gunicornがapp:appを参照します)
from flask import Flask
app = Flask(__name__)
@app.get("/")
def root():
return {"message": "Deployed on Render!"}
if __name__ == "__main__":
# ローカル動作用(本番はGunicornが起動するため使われません)
app.run(debug=True)
# requirements.txt
Flask==3.0.0
gunicorn==21.2.0
2. RenderでWebサービス作成
- Renderにサインアップし、New → Web Serviceを選択
- GitHubのリポジトリを選択
- Environmentは
Python
- Build Command:
pip install -r requirements.txt
- Start Command:
gunicorn app:app
- Freeプランを選択してデプロイ
# デプロイ後、Renderが生成したURL例
https://flask-hello.onrender.com/
このURLにアクセスすると、先ほどのDeployed on Render!
が表示されます。
Render等のPaaSではPORT
という環境変数が与えられますが、Gunicornを使う場合は特にアプリ側の修正は不要です(プラットフォームが適切に起動します)。
ポートと環境変数の設定ポイント
- 開発時は
flask --app app --debug run
が簡単です。従来のFLASK_APP=app
設定は不要です。 - デバッグを有効にするには
--debug
またはFLASK_DEBUG=1
を使います。本番では絶対に無効にしてください。 - インターネット公開が前提の環境では、
host=0.0.0.0
で待ち受けることがあります。ただし開発サーバーのまま外部公開しないでください。 - PaaS(Render等)ではプラットフォームが
PORT
を割り当てます。gunicorn app:app
のようにWSGIサーバーを使えば、特別なコード変更なしで動作します。 - 任意で設定値を環境変数にまとめたい場合は
python-dotenv
を使うと便利です(本記事では詳細割愛)。
目的 | 使うコマンドや設定 | 注意点 |
---|---|---|
ローカルで即起動 | flask –app app –debug run | デバッグは本番で使わない |
LAN内で共有 | flask –app app run –host 0.0.0.0 –port 5000 | ルーター越し公開は不可 |
一時的に公開 | ngrok http 5000 | URLは一時的。Ctrl+Cで終了 |
恒久的に公開 | gunicorn app:app(Render等) | requirements.txtにgunicornを追加 |
まとめ
ここまでで、Flaskによる最小のWeb APIを作成し、ローカル動作から一時公開、そして無料PaaSでのデプロイまでを一気に体験しました。
Flaskは学習コストが低く、Hello Worldから実用の第一歩までが短いのが最大の魅力です。
次のステップとしては、エラーハンドリングの充実、CORS対応、Blueprintによるモジュール化、認証などを検討すると良いでしょう。
より大規模なWebアプリにはDjango、型志向で高速なAPIにはFastAPIなどの選択肢もありますが、それらは別の記事で詳しく扱います。
まずは本記事のコードを自分の用途に合わせて拡張し、小さく作って素早く公開する体験を積み重ねてください。