シンプルで強力なPythonフレームワーク: Flask解説

Flaskは、シンプルさと拡張性を誇るPythonフレームワークであり、その設計はコードの簡潔さと開発者の自由度を重視しています。Flaskは大規模なフレームワークから学んだ教訓を取り入れつつ、独自の方法で問題を解決します。この記事では、Flaskの特性とその利点について詳しく解説します。

このように、Flaskは独特な特性と利点を持つフレームワークであり、それぞれのプロジェクトやチームの要件により最適なフレームワークを選ぶことが重要です。

概要

FlaskはPythonのWebフレームワークであり、シンプルさと容易な拡張性を特徴としています。

Flaskの主要な機能には、ルーティング、リクエストとレスポンスの処理、テンプレートエンジンなどが含まれます。 また、多くのサードパーティ製のFlask拡張機能が存在するため、開発者はその機能を簡単に拡張できます。

FlaskはFastAPIと同様にJSONをレスポンスとして返却するAPIを構築する際にも使えますが、標準の機能としてはデータの検証や非同期処理が提供されていません。

ここでは、以下バージョンを使用した、Flaskの基本的な使い方を紹介します。

Flask v2.0.1
Python 3.9.7

Flaskの基本概念

ルーティング

ルーティングとは、クライアントからのHTTPリクエストを受け取り、それに対応する処理を行うためのメカニズムです。Flaskは、デコレータを使用して、異なるURLパスやHTTPメソッドに対するリクエストをマッチングさせることができます。

from flask import Flask, request

app = Flask(__name__)

# GETメソッドに対するルートの定義
@app.route('/', methods=['GET'])
def read_root():
  return {"Hello": "World"}

# POSTメソッドに対するルートの定義
@app.route('/items/', methods=['POST'])
def create_item():
  item = request.get_json()
  return item

上記の例では、Flaskのデコレータを使用してルーティングを定義しています。@app.route('/', methods=['GET'])は、ルートURL(’/’)に対するGETリクエストを処理します。同様に、@app.route('/items/', methods=['POST'])は、’/items/’ URLに対するPOSTリクエストを処理します。

パラメータとリクエストボディ

Flaskでは、ルートパラメータ、クエリパラメータ、リクエストボディを使用して、クライアントからのデータを取得することができます。

from flask import Flask, request

app = Flask(__name__)

@app.route('/items/<int:item_id>', methods=['GET'])
def read_item(item_id):
  q = request.args.get('q', default = None, type = str)
  return {"item_id": item_id, "q": q}

@app.route('/items/', methods=['POST'])
def create_item():
  item = request.get_json()
  return item

上記の例では、read_item関数では、ルートパラメータitem_idとクエリパラメータqを取得しています。create_item関数では、リクエストボディからデータを取得しています。

レスポンスモデル

Flaskは自動的なレスポンスモデルの機能を提供していませんが、サードパーティ製のライブラリを利用することで、APIのレスポンスの形式を明示的に指定することができます。例えばmarshmallowなどのライブラリがこの目的で広く使用されています。

from flask import Flask, request
from marshmallow import Schema, fields

app = Flask(__name__)

class ItemSchema(Schema):
  name = fields.Str(required=True)
  price = fields.Float(required=True)
  is_offer = fields.Bool(missing=None)

item_schema = ItemSchema()

@app.route('/items/', methods=['POST'])
def create_item():
  item = request.get_json()
  # データ検証
  item = item_schema.load(item)
  return item_schema.dump(item)

上記の例では、create_item関数でPOSTされたデータをItemSchemaで検証し、その後、JSON形式で返却しています。

Flaskの特徴

シンプルさと拡張性

Flaskはシンプルなフレームワークであり、容易な拡張性を提供します。Flask自体は小さなコア機能を持つものの、豊富なサードパーティ製の拡張機能を利用することで、さまざまな機能を追加することが可能です。

もちろん、続きを書きます。

テンプレートエンジン

FlaskはJinja2という強力なテンプレートエンジンを組み込んでいます。Jinja2を使うと、HTMLテンプレートに動的データを組み込むことができます。これにより、動的Webページを簡単に作成することが可能です。

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/hello/<name>')
def hello(name=None):
    return render_template('hello.html', name=name)

この例では、hello.html テンプレートに name という変数を渡しています。テンプレートでは、この変数を {% raw %}{{ name }}{% endraw %} の形式で参照して値を表示することができます。

リクエストのデータ処理

Flaskは request オブジェクトを通じてクライアントから送信されたデータに簡単にアクセスできます。このオブジェクトには、送信されたフォームデータやJSONデータ、ファイル、クッキー、ヘッダー情報などが含まれます。

セッション管理

Flaskはクライアント固有のデータを保存するためのセッション管理機能を提供しています。セッションデータはクライアントのブラウザに保存され、それぞれのリクエスト間でデータを保持することが可能です。これは、ユーザー認証機能の実装などに非常に便利です。

テストの容易さ

Flaskはアプリケーションのテストを容易にする機能を提供しています。 flask.testing モジュールを利用すると、アプリケーションの各部分を独立してテストしたり、アプリケーション全体をテストするための環境を簡単に設定したりすることができます。

以上がFlaskの主な特徴の一部です。PythonでWebアプリケーションを開発する場合、その柔軟性とシンプルさから、初めてのプロジェクトにも経験豊富な開発者にもFlaskは人気の選択肢となっています。

FastAPIvsFlask

FastAPIとFlaskはどちらも人気のあるPythonのWebフレームワークですが、それぞれ異なる設計思想と特徴を持っています。以下に、これらのフレームワークの主要な違いをまとめています。

パフォーマンス

FastAPIはStarlette(ASGI)に基づいているため、非同期処理をサポートしています。これにより、FastAPIはFlask(WSGI)よりも高速でスケーラブルなアプリケーションを作成することが可能です。

データ検証とシリアライゼーション

FastAPIは、Pythonの型ヒントとPydanticモデルを利用してデータ検証とシリアライゼーションを行います。これにより、APIのリクエストとレスポンスの形式を定義し、自動的にデータを検証し、エラーを処理することができます。一方、Flaskではこのような機能は提供しておらず、通常は追加のライブラリ(例えばmarshmallow)が必要です。

APIドキュメンテーション

FastAPIはOpenAPIとJSON Schemaの標準を使用して自動的にAPIドキュメンテーションを生成します。これにより、APIのエンドポイント、リクエストボディ、パラメータ、レスポンスなどの詳細を確認することができます。Flaskでは、このような機能を提供していませんが、Flasggerやflask-apispecなどの拡張機能を使用することで、APIドキュメンテーションを生成することが可能です。

テンプレートエンジン

FlaskはJinja2という強力なテンプレートエンジンを組み込んでいます。これを利用して、HTMLテンプレートに動的データを組み込むことができます。一方、FastAPIはAPI構築に特化しており、標準でテンプレートエンジンを提供していません。しかし、Starletteの機能を利用することで、Jinja2のテンプレートエンジンを使用することも可能です。

柔軟性と拡張性

Flaskは、自由度の高さと拡張性に重点を置いて設計されています。これにより、開発者は必要な機能だけを選択して追加することができ、アプリケーションの構造を自由に設計することが可能です。一方、FastAPIは高パフォーマンスとAPIの構築に焦点を当てており、柔軟性という点ではFlaskに劣る可能性があります。

まとめ

FastAPIとFlaskはそれぞれ異なるユースケースに適しています。FastAPIは高パフォーマンスなAPIの構築やデータ駆動型のアプリケーションに優れています。一方、Flaskはそのシンプルさと柔軟性から、カスタムアプリケーションの構築や初心者向けの学習ツールとして人気があります。

どちらのフレームワークを選択するかは、プロジェクトの要件や開発者の経験に大きく依存します。具体的な要件や目標を明確に定義し、それぞれのフレームワークの特性を理解した上で選択することが重要です。