Flask

プログラミング言語 | IT用語集

この用語をシェア

概要

Flask(フラスク)は、Pythonで開発された軽量で柔軟なWebアプリケーションフレームワークです。開発者のArmin Ronacherらが2010年に公開し、現在はPallets Projectsが開発・保守を行っています。「マイクロフレームワーク」と呼ばれる理由は、フレームワーク自体はルーティングとリクエスト処理という最小限のコアしか持たず、データベースアクセス、認証、フォームバリデーションといった機能を標準搭載しない点にあります。これはDjangoのような「フルスタック」型フレームワークとは対照的な設計思想で、Flask公式ドキュメントでも「マイクロという言葉は機能が少ないという意味ではなく、コアがシンプルで拡張可能という意味である」と説明されています。

内部的にはWSGIツールキットのWerkzeugとテンプレートエンジンのJinja2という、いずれもPallets Projectsが管理する2つのライブラリの上に薄いレイヤーとして実装されています。この構造により、Flask自体のコードベースは比較的小さく保たれており、開発者は必要な機能だけをFlask拡張(Flask-SQLAlchemy、Flask-Loginなど)やサードパーティ製ライブラリで自由に組み合わせて使うことができます。小規模なAPIサーバーからプロトタイプ開発、機械学習モデルの推論エンドポイント公開まで、「まず動くものを素早く作りたい」という場面で選ばれることが多いフレームワークです。

特徴

  • 軽量・シンプル:最小限のコア機能のみを提供するマイクロフレームワーク
  • 高い柔軟性:必要な機能を選択して追加できる拡張可能な設計
  • 学習コストが低い:直感的なAPIで初心者でも理解しやすい
  • Jinja2テンプレートエンジン:強力で使いやすいテンプレート機能
  • Werkzegベース:WSGIツールキットの上に構築され安定性が高い
  • 豊富な拡張機能:Flask-SQLAlchemy、Flask-Login等の充実したエコシステム
  • 開発用サーバー内蔵:開発時に簡単にローカルサーバーを起動可能

アーキテクチャ(仕組み)

FlaskはWSGI(Web Server Gateway Interface)準拠のフレームワークです。WSGIはPythonアプリケーションとWebサーバーの間の標準インターフェース仕様で、Flaskはこの仕様に沿ってHTTPリクエストをPythonの関数呼び出しに変換します。最小構成のFlaskアプリケーションは次のように書けます。

from flask import Flask, jsonify

app = Flask(__name__)

@app.route("/api/health", methods=["GET"])
def health_check():
    return jsonify(status="ok")

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

この10行足らずのコードだけで、開発用サーバーが起動しHTTPリクエストを処理できる点がFlaskの特徴を端的に示しています。Django のようにstartprojectコマンドで大量のディレクトリ構成が生成されることはなく、1ファイルからでも開発を始められます。

  • アプリケーションファクトリパターンcreate_app()関数でアプリケーションインスタンスを生成し、設定の異なる複数環境(開発・テスト・本番)を切り替えやすくする定石
  • Blueprint:ルーティングやテンプレートを機能単位でモジュール化する仕組み。ユーザー管理、決済、管理画面などをそれぞれ独立したBlueprintとして実装し、app.register_blueprint()で結合する
  • リクエストコンテキスト/アプリケーションコンテキストrequestgオブジェクトはスレッドローカルなコンテキストとして管理され、リクエスト処理中のみ有効になる
  • ルーティング@app.routeデコレータでURLパターンとハンドラ関数を紐付ける。<int:user_id>のような型付き変換ルールも指定可能
  • テンプレート:Jinja2テンプレートエンジンによりHTMLへの変数埋め込み・継承・マクロ定義が行える。デフォルトで自動エスケープが有効なためXSS対策の初期設定は比較的安全

具体例・ユースケース

Flaskが実務で選ばれる典型的な場面を、具体的なコードとともに見てみます。例えば機械学習モデルを社内向けAPIとして公開する場合、次のように数十行程度でリクエストを受け取り推論結果を返すエンドポイントを実装できます。

from flask import Flask, request, jsonify

app = Flask(__name__)
model = load_model()  # 学習済みモデルを読み込む想定

@app.route("/predict", methods=["POST"])
def predict():
    payload = request.get_json()
    features = payload.get("features", [])
    result = model.predict([features])
    return jsonify(prediction=result.tolist())

このように「HTTPで受け取ったJSONをPython関数に渡し、結果をJSONで返す」という薄いAPIラッパーを作る用途は、Flaskが最も強みを発揮する場面の一つです。実際に、pandas・NumPy・scikit-learnなどのデータ分析ライブラリと組み合わせて社内ダッシュボードや検証用APIを短期間で立ち上げる、といった使い方は現場でよく見られます。

具体的なユースケースを整理すると次のようになります。

  • RESTful API・社内向けバックエンド:フロントエンド(React、Vue.jsなど)と分離したJSON APIサーバーの構築。認証にFlask-JWT-Extendedを組み合わせるケースが多い
  • プロトタイプ・MVP開発:スタートアップや新規事業で、アイデアを最短距離で動くWebアプリに変換する用途。要件が固まったら段階的にDjangoやFastAPIへ移行することも珍しくない
  • 機械学習モデルの推論API化:Jupyter Notebookで学習したモデルをそのままFlaskエンドポイントにラップし、他システムから呼び出せるようにする
  • Webhook受信エンドポイント:Slack、Stripe、GitHubなど外部サービスからのWebhook通知を受け取り、後続処理へつなぐ小さなサービス
  • 社内ツール・管理画面:Flask-AdminやJinja2テンプレートを使い、DBの中身を確認・編集するだけの簡易管理画面を短期間で構築
  • マイクロサービスの1コンポーネント:単一責任の小さなサービスとして、Docker コンテナ1つに1 Flaskアプリという構成で運用
  • 教育・学習用途:WSGI、ルーティング、テンプレートエンジンといったWebフレームワークの基礎概念を学ぶ教材として大学の授業やオンライン講座でも採用例が多い

Blueprintによる機能分割の例

アプリが大きくなってきたら、ルーティングをBlueprint単位に分割するのが定石です。

from flask import Blueprint, jsonify

users_bp = Blueprint("users", __name__, url_prefix="/users")

@users_bp.route("/<int:user_id>")
def get_user(user_id):
    return jsonify(id=user_id, name="Taro")

# app.py 側で登録
# app.register_blueprint(users_bp)

メリット・デメリット

Flaskを採用するかどうかを判断する際は、以下のトレードオフを理解しておくことが重要です。

観点 メリット デメリット・注意点
学習コスト コアAPIが小さく、公式ドキュメントも簡潔で初学者が短時間で全体像を把握できる 「お作法」が決まっていないため、ディレクトリ構成や設計方針をチームで独自に決める必要がある
拡張性 必要な機能だけを選んで追加できるため、アプリが不要な依存関係を抱えにくい ORM・認証・バリデーションなどを個別に選定・統合する手間が発生し、大規模化すると拡張ライブラリ間の相性検証が必要になる
開発速度 最小構成なら数分でAPIサーバーを起動でき、プロトタイピングが速い 大規模チーム開発では規約がない分、コードの一貫性維持がDjangoより難しくなりやすい
非同期処理 Flask 2.0以降はasync def によるビュー関数の定義に対応 内部実装は同期WSGIベースのままで、FastAPIやQuartのようなASGIネイティブな非同期処理とは性質が異なり、大量の非同期I/Oが必要な用途には不向き
API仕様の自動化 Flask-RESTXやflask-smorestなどでOpenAPIドキュメントを生成できる FastAPIのように型ヒントから自動でOpenAPI仕様とバリデーションが生成される仕組みは標準では持たない
エコシステムの成熟度 10年以上の実績があり、拡張ライブラリや解説記事、Stack Overflowの知見が豊富 新規プロジェクトでは、より新しい設計思想を持つFastAPIやDjangoが選ばれる比率が近年高まっている

混同されやすい用語・類似技術との違い

Flaskは他のPython製Webフレームワークとしばしば比較・混同されます。それぞれの立ち位置の違いを整理します。

技術 位置づけ Flaskとの主な違い
Django フルスタックフレームワーク ORM、管理画面、認証、フォームが標準搭載。規約に沿えば大規模開発でも一貫性を保ちやすい反面、Flaskほど自由に構成を選べない
FastAPI 非同期・型ヒント指向のAPIフレームワーク ASGIベースで非同期I/Oを前提とし、Pythonの型ヒントからリクエストバリデーションとOpenAPIドキュメントを自動生成する。新規API開発ではFastAPIを選ぶプロジェクトが増えている
Quart Flask互換の非同期フレームワーク Flaskとほぼ同じAPIを持ちながらASGI・async/awaitをネイティブサポート。既存Flaskアプリを非同期化したい場合の移行先として使われる
Bottle 単一ファイル完結の超軽量フレームワーク 依存ライブラリがなく1ファイルで完結する点がFlask以上に極端。拡張エコシステムはFlaskよりかなり小さい
Express Node.js版の軽量フレームワーク 設計思想(最小コア+ミドルウェアで拡張)はFlaskと非常に近いが、実行環境がNode.js(JavaScript/TypeScript)である点が異なる
Werkzeug / Jinja2 Flaskの内部コンポーネント フレームワークではなく、それぞれWSGIツールキットとテンプレートエンジンという役割を持つライブラリ。Flaskはこの2つを統合した薄いレイヤー

なお「Flask」という名称は化学実験に使うフラスコに由来し、姉妹プロジェクトのBottle(同じくPython製の軽量フレームワーク)と対比した命名という説がよく語られますが、公式に由来が明言されているわけではない点には留意してください。

パフォーマンスと実務上の注意点

Flask自体のコアは薄いためオーバーヘッドは小さく、起動も高速です。ただし本番運用では以下の点を押さえておく必要があります。

  • 開発用サーバーは本番利用不可app.run()で起動する組み込みサーバーはシングルスレッドかつデバッグ用途向けで、本番環境ではGunicornやuWSGIなどのWSGIサーバーの配下で動かすのが定石
  • 同期WSGIモデルの限界:標準のFlaskは1リクエストにつき1ワーカースレッド(またはプロセス)を占有する同期モデルのため、大量の外部API呼び出しなどI/O待ちが多い処理では、ワーカー数を増やすかQuart/FastAPIのような非同期フレームワークへの切り替えを検討する
  • スケールアウト:Gunicornのワーカープロセス数やuWSGIのプロセス/スレッド設定をCPUコア数に応じて調整し、Nginxなどのリバースプロキシと組み合わせて水平スケールさせるのが一般的な構成
  • キャッシング:Flask-Cachingを使い、計算コストの高いビューやDBクエリ結果をRedis等にキャッシュすることでレスポンスタイムを改善できる
  • バックグラウンド処理:メール送信や重い集計処理はリクエスト内で同期実行せず、Celeryなどのタスクキューに委譲してレスポンスを遅延させない設計にする

エコシステム

Flask本体は最小限の機能しか持たないため、実務での機能拡張は主に公式・サードパーティの拡張ライブラリ(一般に「Flask拡張」と呼ばれる)に頼ることになります。代表的なものを用途別に整理します。

  • Flask-SQLAlchemy:SQLAlchemy ORMをFlaskアプリに統合し、モデル定義・クエリ発行を簡潔に書けるようにする
  • Flask-Login:ユーザーのログイン状態管理・セッション処理を提供
  • Flask-WTF:WTFormsと連携したフォームバリデーション・CSRF保護
  • Flask-Mail:SMTP経由のメール送信機能
  • Flask-RESTful / Flask-RESTX / flask-smorest:REST API開発を支援し、後者2つはOpenAPI(Swagger)ドキュメントの自動生成にも対応
  • Flask-Admin:モデル定義から管理画面を自動生成
  • Flask-Testing / pytest-flask:テストクライアントを使ったユニットテスト・統合テスト支援
  • Flask-Migrate:Alembicをラップしたデータベースマイグレーション管理
  • Flask-Caching:ビューやクエリ結果のキャッシュ(メモリ、Redis等に対応)
  • Flask-CORS:フロントエンドとバックエンドを別ドメインで運用する際のCORS設定

Flask選択のポイント

Flaskは学習コストが低く、シンプルな構造で素早く開発を始められるため、Python初心者・小規模チームでのプロトタイプ開発・機械学習モデルの簡易API化に向いています。一方、大規模な企業システムで規約に沿った統一設計を重視するならDjango、非同期処理やAPI仕様の自動生成を重視する新規API開発ならFastAPIが選択肢に挙がります。「まず動くものを最短で作りたいか」「チームとしての規約や自動生成の恩恵を重視するか」を軸に検討するとよいでしょう。

2025-2026年の最新動向

Flask 3.x系では、Python 3.8以降を前提としたモダンな型ヒント対応や、async defによるビュー関数定義の安定化が進んでいます。Werkzeug・Jinja2側もメジャーバージョンが足並みを揃えて更新されており、Pallets Projects全体としての保守は継続的に行われています。一方でAPI開発の現場では、型ヒントからバリデーションとOpenAPIドキュメントを自動生成できるFastAPIへの新規案件での移行トレンドが顕著で、Flaskは「枯れた技術として既存システムを保守する」「シンプルなWebアプリやプロトタイプを素早く作る」という役割に位置づけが定まりつつあります。

Quart(Flask互換のASGI非同期フレームワーク)も引き続き注目されており、既存のFlaskコードベースをほぼそのままの書き方で非同期化する移行先として採用が増えています。また、機械学習・生成AI分野ではモデル推論APIの試作段階でFlaskが依然としてよく使われる一方、本番運用フェーズではFastAPIやレイテンシ要件に応じた非同期フレームワークに置き換えられるケースも見られます。Flask自体を新規に学ぶ場合も、まずFlaskでWebフレームワークの基礎概念(ルーティング、テンプレート、リクエスト処理)を理解してから、必要に応じてFastAPIやDjangoへ進むという学習順序が実務でもよく採られています。

よくある質問(FAQ)

Q. Flaskとは?

Pythonの軽量Webフレームワーク(マイクロフレームワーク)です。ルーティングとリクエスト処理という最小限のコアのみを提供し、データベースアクセスや認証などは拡張ライブラリを組み合わせて実装する設計です。WSGIツールキットのWerkzeugとテンプレートエンジンのJinja2を基盤としています。

Q. FlaskとDjangoの違いは?

Flaskはマイクロフレームワークで、ORMや認証などを自分で選んで組み合わせます。Djangoはこれらを標準搭載したフルスタックフレームワークで、規約に沿えば大規模開発でも一貫性を保ちやすい反面、自由度はFlaskより低くなります。小規模API・プロトタイプにはFlask、規約に沿った大規模Webアプリ開発にはDjangoが向いています。

Q. FlaskとFastAPIはどちらを選ぶべき?

非同期I/Oを前提としたAPIで、型ヒントからのバリデーションやOpenAPIドキュメント自動生成を重視するなら FastAPI が有力です。既存資産の保守やシンプルな同期処理中心のアプリ、学習コストの低さを重視するなら Flask が向いています。新規のAPI開発案件ではFastAPIが選ばれる比率が近年高まっています。

Q. Flaskは本番環境でそのまま使えますか?

app.run()で起動する開発用サーバーはデバッグ用途向けでシングルスレッドのため、本番環境ではGunicornやuWSGIなどのWSGIサーバーの配下で動かし、Nginx等のリバースプロキシと組み合わせて運用するのが一般的です。

Q. Flaskのメリット・デメリットは?

メリットは学習コストの低さ、必要な機能だけを選べる柔軟性、豊富な拡張ライブラリです。デメリットは、ディレクトリ構成や設計方針をチームで独自に決める必要がある点、標準では非同期I/Oやスキーマ自動生成に対応していない点が挙げられます。

Q. 2025-2026年の最新動向は?

Flask 3.x系での型ヒント対応強化、API開発におけるFastAPIへの移行トレンド、Quart(Flask互換の非同期フレームワーク)への注目が主な動きです。Flaskは既存プロジェクトの保守やプロトタイプ開発での利用が中心になりつつあります。

関連用語

  • Python - Flaskのベース言語
  • Django - Pythonフルスタックフレームワーク
  • FastAPI - Python製の非同期・型ヒント指向APIフレームワーク
  • Express - Node.js版の軽量フレームワーク
  • Laravel - PHP Webフレームワーク
  • Spring Boot - Java製のフルスタックフレームワーク
  • Node.js - JavaScriptサーバーサイド実行環境

外部リンク

この用語についてもっと詳しく

Flaskに関するご質問や、システム導入のご相談など、お気軽にお問い合わせください。