閉じる

最短で作るFlask Web API(Python): Hello Worldから公開まで

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 –versionOS標準でも可
pipはい最新pip –versionPythonに付属
Git(GitHub)任意最新git –versionRenderへデプロイ時に便利
ngrok任意最新ngrok version一時公開に使用

まずは手元で動かし、次に公開という順で進めます。

開発準備とインストール

Pythonとpipの確認方法

お使いの環境でPythonとpipが使えるか確認します。

Windowsではpyコマンドでも実行できます。

Shell
# 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)の作り方

プロジェクトごとに依存関係を分離するため、仮想環境を使うことを強く推奨します。

Shell
# プロジェクト用のフォルダを作成して移動
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をインストールします。

Shell
pip install flask
pip show flask  # バージョン確認
実行結果
Name: Flask
Version: 3.0.0
Summary: A simple framework for building complex web applications.
...

必要なら依存関係を保存しておきます。

Shell
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も用意しておくと便利です。

text
flask-hello/
├─ .venv/               # 仮想環境(そのまま)
├─ app.py               # Flaskアプリ本体
└─ requirements.txt     # 依存パッケージ(任意)

Hello WorldなFlask Web APIの作り方

最小のapp.pyを作成

まずはJSONでHello Worldを返すエンドポイントを作ります。

Python
# 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などのショートカットが使えます。

パスパラメータも簡単です。

Python
# app.py に追記例

# /hello/<name> のようにパスパラメータを受け取る
@app.get("/hello/<name>")
def hello_name(name):
    # 受け取ったnameを使って挨拶を返す
    return {"message": f"Hello, {name}!"}

スクリプトを再実行する必要はありません。自動的にapp.pyの変更を検知して反映してくれます。

このエンドポイントは/hello/Aliceのようにアクセスできます。

JSONレスポンスの返し方

Flaskでは辞書を返すと自動でJSONに変換されますが、ステータスコードやヘッダーを細かく制御したいときはjsonifyが便利です。

Python
from flask import jsonify

@app.get("/status")
def status():
    data = {"ok": True, "service": "flask-hello"}
    # ステータスコード201(Created)で返す例
    return jsonify(data), 201
JSON
{
  "ok": true,
  "service": "flask-hello"
}

実行方法(flask run)と停止

開発中はflaskコマンドが便利です。

環境変数を設定せず、–appオプションで起動できます。

Shell
# デバッグモードで起動(自動リロード)
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です。

直接python app.pyで起動しても構いません。

動作確認(ブラウザ・curl)

ブラウザでhttp://127.0.0.1:5000/にアクセスするほか、curlでAPIの動作を確認できます。

Shell
# ルートパスの確認
curl -s http://127.0.0.1:5000/

# パスパラメータの確認
curl -s http://127.0.0.1:5000/hello/Alice
JSON
{"message":"Hello, World!"}
{"message":"Hello, Alice!"}

GET/POSTエンドポイントを追加

実用の一歩として、クエリ文字列を受け取るGETと、JSONを受け取るPOSTを追加します。

Python
# 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}
Shell
# 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}'
JSON
{"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で待ち受けます。

Shell
# 例: ポート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はローカルのポートを安全に外部へトンネル公開します。

デモや動作確認に最適です。

Shell
# 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リポジトリに置きます。

text
app.py
requirements.txt
Python
# 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サービス作成

  1. Renderにサインアップし、New → Web Serviceを選択
  2. GitHubのリポジトリを選択
  3. EnvironmentはPython
  4. Build Command: pip install -r requirements.txt
  5. Start Command: gunicorn app:app
  6. Freeプランを選択してデプロイ
text
# デプロイ後、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 5000URLは一時的。Ctrl+Cで終了
恒久的に公開gunicorn app:app(Render等)requirements.txtにgunicornを追加

まとめ

ここまでで、Flaskによる最小のWeb APIを作成し、ローカル動作から一時公開、そして無料PaaSでのデプロイまでを一気に体験しました。

Flaskは学習コストが低く、Hello Worldから実用の第一歩までが短いのが最大の魅力です。

次のステップとしては、エラーハンドリングの充実、CORS対応、Blueprintによるモジュール化、認証などを検討すると良いでしょう。

より大規模なWebアプリにはDjango、型志向で高速なAPIにはFastAPIなどの選択肢もありますが、それらは別の記事で詳しく扱います。

まずは本記事のコードを自分の用途に合わせて拡張し、小さく作って素早く公開する体験を積み重ねてください。

この記事を書いた人
エーテリア編集部
エーテリア編集部

人気のPythonを初めて学ぶ方向けに、文法の基本から小さな自動化まで、実際に手を動かして理解できる記事を書いています。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!