PythonマイクロフレームワークであるFlaskの始め方

この記事では、Djangoという巨大なフレームワークの代替として人気のあるPythonのマイクロフレームワークであるFlaskについて紹介します。

Flaskは軽量で柔軟性に富んでおり、開発者が迅速かつ容易にWebアプリケーションを作成できるよう設計されています。この記事では、Flaskとは何か、その主要な機能、シンプルなAPIの利点、サードパーティ拡張機能をサポートする柔軟性、最も一般的なFlask拡張機能、そしてFlaskを使用するべき、またはしないべき状況について説明します。

ポイント

  1. Flaskの機能と使用例の概要: この記事では、Flaskを紹介し、その軽量で柔軟な性質と、さまざまなWebプロジェクトに適していることを強調します。Flaskのシンプルさ、拡張機能のサポート、主要な機能、そしてプロトタイピング、RESTful API、電子商取引アプリなどの実践的な使用例を探ります。

  2. Djangoとの比較分析: この記事では、FlaskをDjangoと比較し、Flaskのマイクロフレームワークアプローチが複雑さを伴わずに基本のツールを提供することを強調し、最小主義とカスタム拡張が必要なプロジェクトに適していることを示します。

  3. Flaskで始める: 記事では、Flask開発環境の設定方法、基本的なアプリケーションの作成と実行方法、そしてルーティング、テンプレート、フォーム、拡張機能など、Flaskの機能を活用する手順を段階的に説明しています。

Flaskとは何か?

FlaskはPythonで書かれたマイクロウェブフレームワークで、ウェブアプリケーションの開発に使用されます。シンプルで軽量なものを保つというシンプルな哲学に基づいており、ウェブアプリケーション構築に必要な最も重要なツールのみを開発者に提供し、不要な複雑さを避けています。

Werkzeug WSGIツールキットの上に構築されており、これによりリクエストとレスポンスを処理するためのウェブサーバー機能が提供されます。また、Jinja2テンプレートエンジンを使用しており、HTMLテンプレートの処理能力をFlaskに与え、開発者が動的なウェブアプリケーションを作成できるようになっています。

Flaskが優れたフレームワークとされる主な特徴は以下の通りです:

  • ウェブルートの作成とリクエストの処理のためのシンプルなAPIを持っています。
  • JinjaテンプレートエンジンはHTMLテンプレートをサポートし、開発者がウェブページを簡単に作成できるようにします。
  • その拡張性は高く、サードパーティの拡張機能をサポートしているため、開発者はプロジェクトのニーズに応じて拡張機能をインストールできます。
  • 開発サーバーが同梱されており、アプリケーションのテストやデバッグを簡単に行えます。

全体として、Flaskはウェブアプリケーション構築のための強力で柔軟でありながらシンプルなフレームワークを提供しています。これは初心者も経験者も、Pythonのウェブ開発エコシステムの中で最も人気のあるウェブフレームワークの一つです。

Flaskの利点

次に、Flaskを開発に使用することの利点をもう少し詳しく見ていきましょう。

シンプルさ。Flaskのデザイン哲学はシンプルさを重視しており、あらゆるレベルの開発者が理解し使用しやすくなっています。これはまた、ウェブアプリケーションを開始するために開発者が学ぶべき概念やAPIが非常に少ないことを意味し、学習曲線が非常に低いことを意味します。

柔軟性。Flaskのマイクロな性質は、ウェブフレームワークのコア機能のみを提供するため、開発者はFlask拡張機能やサードパーティのライブラリを使用して、独自の要件に合わせてカスタマイズし拡張できます。

ドキュメント。Flaskのドキュメントは非常に包括的で、基本的なトピックから高度なトピックまでカバーされており、開発者がフレームワークを使用する方法を学ぶのが非常に簡単です。

互換性. Flaskは幅広いPythonバージョンと互換性があり、既存のPythonコードベースでの使用が容易です。また、複数のWebサーバーをサポートしており、さまざまなホスティングプラットフォームでのデプロイが簡単になります。

迅速な開発. Flaskのシンプルさと柔軟性により、アプリケーションを設定するために必要なボイラープレートが減少し、開発者が迅速に始められます。

ウェブ上では、Flaskが多くの興味深い方法で使用されています。いくつかの注目すべき例は以下の通りです:

  • PgAdmin. これはPostgresの管理インターフェースで、Flaskインスタンス上で動作しており、開発者はそこでPostgresデータベースを管理できます。
  • Twilio. これはFlaskをいくつかのAPIで使用している通信プラットフォームです。
  • Pinterest. この写真共有アプリは、ウェブ開発スタックでFlaskを使用しており、チームは独自の機能や統合を簡単に作成できます。

Flaskを使用する場合

Flaskのシンプルさと使いやすさは、幅広いウェブプロジェクトに最適な選択肢です:

  • プロトタイピング. 使いやすさと柔軟性のため、迅速にプロトタイプを作成するのに優れた選択肢であり、開発者は新機能を迅速に構築・テストできます。
  • RESTful APIの作成. そのシンプルなAPIにより、HTTPリクエストを作成および処理することが容易です。
  • eコマースアプリ. オンラインマーケットプレイスやeコマースプラットフォームを構築するのに適しています。
  • ファイナンス。口座管理、取引処理、そして投資の追跡を含む財務アプリケーションを構築するために有用です。
  • AI。AIトレーニングモデルの構築および展開を、有用かつ簡単な方法で提供します。

Flaskを使用しない場合

Flaskは素晴らしいフレームワークであり、多くの利点と優れた機能を持っていますが、その機能が逆効果となる状況もあります。他のタイプのフレームワークに適したプロジェクトをいくつか探ってみましょう。

組み込み機能を必要とするプロジェクト。マイクロフレームワークであるFlaskは、Webアプリケーションを作成するために必要なコア部分のみを提供します。もし、管理者インターフェース、認証、またはORMなどが必要な場合は、Djangoの方が良い選択です。

厳格なセキュリティ要件を持つプロジェクト。Flaskは柔軟なフレームワークなので、アプリケーションのセキュリティレベルを実装するために第三者の拡張機能に依存する必要があります。これは確かに機能しますが、より安全なアプローチを取るような、より経験豊富なフレームワークに依存する方が良いでしょう、例えばTornadoやTwistedなどです。

特定のコーディング基準を強制するプロジェクト。Flaskの柔軟性のため、その上でアプリケーションを開発することで、開発者は自分の思い通りにアプリを作成できます。しかし、Djangoのようなフレームワークは、開発者が特定の規約に従うことを保証しており、開発者が一つのプロジェクトから別のプロジェクトに移動しやすくなっています。

Flask開発環境のセットアップ

では、Flaskでの始め方を見ていきましょう。開発環境の設定から、インストール、そして最後に最小限のアプリケーションを立ち上げるまでです。

前提条件

開発用マシンにPythonがインストールされている必要があります。以下にインストール方法を示します(ただし、既にインストールされている可能性があります)。

仮想環境の作成

A virtual environment is an isolated Python environment where we can install packages for a given project without affecting the global Python installation. (Here’s further discussion about why virtual environments are useful.) There are different packages for creating virtual environments in Python, such as virtualenv, venv, or Conda.

この記事では、virtualenvを使用します。以下のコマンドでインストールできます。

pip install virtualenv

virtualenvがインストールされたら、Flaskアプリケーションが存在するディレクトリを作成できます。ディレクトリ名は何でも良いですが、Flaskは競合を引き起こすため避けてください。ここではflask_introとします。

mkdir flask_intro

次に、そのディレクトリに移動して使用を開始します。

cd flask_intro

そのディレクトリ内で、次のコマンドを使用して仮想環境を作成しましょう。

virtualenv myenv

上記のコマンドは仮想環境を作成し、myenvと名付けます。Flaskをインストールするために、これをアクティブ化しましょう。LinuxまたはmacOSで仮想環境をアクティブ化するには、以下のコマンドを使用します。

. myenv/bin/activate

Windowsでは、こちらのコマンドを使用します。

. myenv\Scripts\activate

仮想環境がアクティブ化されると、シェルプロンプトに仮想環境の名前が表示され、以下のような出力になります。

(myenv)/~(path to your project directory)$

アクティブ化された仮想環境内で、以下のコマンドを使用してFlaskをインストールできます。

pip install Flask

Flaskのインストールが完了したら、最小限のアプリケーションを作成してみましょう。Flaskアプリケーションを保持するモジュールを作成します。簡単にするために、それをhello.pyと呼びましょう。LinuxまたはmacOSでは、以下のコマンドを使用してflask_introディレクトリにファイルを作成できます。

touch hello.py

上記のコマンドはhello.pyという名前のファイルを作成します。開発環境を使用してファイルを作成することもできます。ファイルが作成されたら、以下のコードを入力し、保存してください。

# hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
    return 'Hello, World!'

上記のコードでは、flaskモジュールからFlaskクラスをインポートし、appと呼ばれるFlaskのインスタンスを__name__変数を渡して作成しています。

次に、ルートデコレータ@app.route(“\”)があり、これはアプリケーションが実行されると、誰かがアプリケーションのルートルートを訪れたときにhello_world()関数がトリガーされることを意味します。

アプリケーションを実行する方法はいくつかありますので、いくつか見てみましょう。最初の方法は、flaskコマンドにいくつかの引数を提供することです。--app、次にFlaskアプリケーションを保持するモジュールの名前、そしてrunです。以下を参照してください。

flask –app <the name of your module> run

上記の例を使用してサンプルアプリケーションを実行するには:

flask –app hello run

それにより、アプリケーションはデフォルトのポート5000で実行され、http://localhost:5000/またはhttp://127.0.0.1:5000/で利用できるようになります。アプリケーションを別のポートで利用可能にしたい場合は、-pまたは--portオプションを使用してポートを指定できます。例えば:

flask --app hello run --port=8080

サーバーをポート8080で実行します。アプリケーションを実行する別の方法は、flask runコマンドを使用するだけです。しかし、それを行うためには、FlaskにFlaskインスタンスを保持するモジュールの名前を伝える必要があります。それをFLASK_APP環境変数を設定することで行います。この場合、Flaskアプリケーションはhello.pyという名前のファイルに含まれています。そのため、以下のように設定できます:

export FLASK_APP=hello

これでFLASK_APP環境変数が設定されたので、開発サーバーを以下のように実行できます:

flask run

そのコードで、Webアプリケーションが実行されています。これはFlaskの中心的な哲学を示しています:多くのボイラープレートコードが必要なく、物事を始めることができます。しかし、上記で設定したアプリケーションは、ページに「Hello World!」という文字列をレンダリングするだけで、あまり機能的ではありません。より有用なことをするためには、テンプレートに頼ることができます。次に、それらをどのように処理するかを見ていきます。

Flaskテンプレート

Flaskテンプレートは、データベースからのデータやユーザー入力など、さまざまな要因に基づいて異なるコンテンツを表示できる動的Webページを作成する方法です。Flaskのテンプレートは、実行時に実際の値に置き換えられるテンプレート変数と呼ばれる特別なプレースホルダとHTMLの組み合わせです。

テンプレートはtemplatesディレクトリに保存されています。したがって、テンプレートを使用するには、flaskからrender_template()メソッドをインポートする必要があります。render_template()メソッドは、テンプレート名とテンプレートに渡す必要がある任意のデータを受け取ります。

テンプレートを使用してウェブページをレンダリングする関数の例を見てみましょう:

# index.py
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
    title = 'Welcome to my website!'
    message = 'This is an example of using Flask templates.'
    return render_template('index.html', title=title, message=message)

上記の例では、ルートURL(“/”)にバインドされたビュー関数index()@app.route()デコレータによって定義されています。この関数にはtitlemessageの2つの変数があります。最後に、render_template()index.htmlテンプレートとtitleおよびmessage変数を渡します。

上記のコードが機能するためには、templatesディレクトリにindex.htmlテンプレートが存在する必要があります。そのテンプレートは次のようなものになります:

# index.html
<!doctype html>
<html>
<head>
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <p>{{ message }}</p>
</body>
</html>

index.htmlファイルでは、プレースホルダ{{title}}{{ message }}render_template()メソッドで渡された値で置き換えられます。

テンプレートは、if文やforループなどのより複雑なロジックも含めることができ、より動的なページの生成が可能です。

したがって、Flaskのテンプレートは、ユーザー生成情報を豊富に含む動的なウェブページを開発者が作成するための非常に強力なオプションを提供します。

Flaskのルーティング

ほとんどのウェブアプリケーションには複数のURLが存在するため、どの関数がどのURLを処理するかを知る方法が必要です。Flaskでは、このマッピングはルーティングと呼ばれます。これは、URLをビュー関数にバインドまたはマッピングするプロセスです。URLをビュー関数にバインドすることで、アプリケーションはGETPOSTPUTDELETEなど、様々なタイプのリクエストを処理できるようになります。また、異なるクライアントからの複数のリクエストを処理することも可能になります。

Flaskでルートを設定するには、route() デコレータを使用します。デコレータはURLをビュー関数にバインドします。つまり、ユーザーがアプリケーション上の存在するURLにアクセスすると、Flaskは関連するビュー関数をトリガーしてリクエストを処理します。

例を見てみましょう:

# hello.py
from flask import Flask, render_template

app = Flask(__name__)

@app.route("/about")
def about():
    return "This is the about page"

上記の例では、/aboutというアバウトURLを定義しています。アプリケーションがabout URLのリクエストを受け取ると、Flaskはabout()関数を呼び出し、文字列“This is the about page”を返します。

これまでの例では、異なるページを返すものの、すべてGET HTTPリクエストを使用していました。特定のリクエストを処理できるようにするために、route()デコレータにHTTPメソッドをオプション引数として指定できます。

PUTリクエストの例を見てみましょう:

from flask import Flask, request

app = Flask(__name__)

@app.route('/users/<int:user_id>', methods=['PUT'])
def update_user(user_id):
    # リクエストボディからユーザーデータを取得
    data = request.get_json()
    # ユーザーデータを何らかの処理を行う、例えばデータベース内のユーザーを更新する
    # ...
    # 成功または失敗を示すレスポンスを返す
    return {'message': f'User {user_id} updated successfully'}, 200

この例では、PUTリクエストを処理し、user_idを持つユーザーの詳細を更新するルートを定義しています。ルート内で<int:user_id>を使用して、ユーザーIDが整数であるべきことを示しています。

update_user()関数では、request.get_json()メソッドを使用してリクエストボディからユーザーデータを取得します。ユーザーデータを何らかの処理を行い、例えばデータベース内のユーザーを更新し、その後、成功または失敗を示すレスポンスを返します。この場合、成功を示すためにHTTPステータスコード200を使用します。

全体として、ルーティングによりFlaskは異なるタイプのリクエストを処理でき、アプリケーションはユーザーが訪れるURLに応じてデータを異なる方法で処理し、アクションを取ることができます。

Flaskフォームとバリデーション

ユーザーにデータを表示するだけでなく、Flaskテンプレートはさらに処理または保存するためにユーザーからの入力を受け取ることもできます。そのために、FlaskはHTMLフォームの処理とユーザー入力の処理をサポートする組み込みの機能を提供しています。FlaskフォームはWTFormsライブラリに基づいており、フォームデータの処理やバリデーションを行うための柔軟で強力な方法を提供しています。ただし、このライブラリは標準のFlaskインストールの一部ではないため、以下のコマンドを使用してインストールする必要があります:

pip install WTForms

WTForms をインストールした後、Flask でフォームを使用するためには、flask_wtf.FlaskForm から継承するフォームクラスを定義する必要があります。このクラスには、フォーム上に表示されるフィールドと、それらに適用されるバリデーションルールが含まれます。

ログインフォームの例を見てみましょう:

# forms.py
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Email, Length

class LoginForm(FlaskForm):
    email = StringField('Email', validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired(), Length(min=6)])
    submit = SubmitField('Log In')

上記の例では、emailpassword の2つのフィールドと、送信ボタンを持つログインフォームを定義しています。また、validators 引数を使用して各フィールドのバリデーションルールを指定しています。例えば、この場合、email フィールドには有効なメールアドレスが必要であり、password フィールドには6文字以上のパスワードが必要です。

フォームクラスを定義した後、ログインビュー関数でそれを使用してフォームをレンダリングし、ユーザーから送信されたフォームデータを処理できます。ビュー関数の例を見てみましょう:

# views.py
from flask import render_template, request
from .forms import LoginForm

@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        email = form.email.data
        password = form.password.data
        # フォームデータで何かをする
    return render_template('login.html', form=form)

上記の例では、login ビューが2つのHTTPメソッド(GETPOST)を受け入れるため、ユーザーがブラウザからURLにアクセスすると、render_template メソッドを使用して LoginForm がHTMLフォームとしてレンダリングされます。ユーザーがフォームを送信すると、validate_on_submit メソッドを使用してフォームが有効かどうかを確認します。フォームが有効な場合、メールとパスワードにアクセスします。

login.html フォームは次のようになるかもしれません:

# login.html
<h1>Login</h1>
<form method="POST">
  {{ form.csrf_token }}
  <div>
    {{ form.email.label }} {{ form.email() }}
    {% for error in form.email.errors %}
    <span style="color: red;">[{{ error }}]</span>
    {% endfor %}
  </div>
  <div>
    {{ form.password.label }} {{ form.password() }}
    {% for error in form.password.errors %}
      <span style="color: red;">[{{ error }}]</span>
    {% endfor %}
  </div>
  {{ form.submit() }}
</form>

上記のテンプレートは、emailおよびpasswordフィールドとそれらのラベル、そして“Login”というテキストのサブミットボタンをレンダリングします。form.csrf_tokenフィールドは、クロスサイトリクエストフォージェリ(CSRF)攻撃を防止するために含まれています。{% for %}ループは、発生する可能性のある検証エラーを表示するために使用されます。

Flaskフォームを使用することで、ユーザー入力を処理する強力な方法が得られ、入力されたデータの検証が可能になります。

Flask拡張機能

Flaskは、Webアプリケーションを作成するために必要な最も重要な部分のみを含むマイクロフレームワークであることを見てきました。ただし、Flaskが標準で提供していない機能を追加する必要がある場合は、インストールにパッケージを追加する必要があります。Flask拡張機能は、この追加機能を提供する方法です。必要なパッケージを簡単にインストールできます。Flaskコミュニティによって多くの拡張機能が作成されています。

以下は、最も人気のあるもののいくつかです。

  • Flask-SQLAlchemy: データベースとの対話を容易にするSQLAlchemyツールキットとの統合を提供します。
  • Flask-Login: Flaskへのユーザー認証とセッション管理を提供します。
  • Flask-Mail: Flaskからのメール送信の簡単なインターフェイスを提供します。

Flaskコミュニティによって作成された数百の拡張機能があり、さまざまな機能を処理します。拡張機能を使用することは一般的に簡単です。まず、pipを使用して必要な拡張機能をインストールする必要があります。

Flask-SQLAlchemyの使用例を見てみましょう。まず、インストールする必要があります。

pip install flask-sqlalchemy

次に、それを設定する必要があります。例えば:

# sqlalchemy_example.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return '<User %r>' % self.username

上記の例では、usernameemail フィールドを持つ User モデルがあります。また、SQLALCHEMY_DATABASE_URI を設定し、example.db にあるSQLiteデータベースを使用していることを示しています。これで設定されると、データベースと対話できるdbオブジェクトにアクセスできるようになります。たとえば、新しいユーザーを作成してデータベースに追加することができます。次のように:

#views.py 
from app import db, User

user = User(username='john', email='[email protected]')
db.session.add(user)
db.session.commit()

Flask拡張機能を使用することで、アプリケーションは基本的なFlask実装だけでは通常持っているであろうより多くの機能を持つことができます。

結論

この記事では、Python用の軽量で柔軟なWebフレームワークであるFlaskを紹介しました。Flaskを使用したWeb開発の利点、そのシンプルさ、柔軟性、使いやすさについて説明しました。また、開発環境の設定方法、ルートの作成、テンプレートの使用、フォームの処理、Flask-SQLAlchemyのような拡張機能の使用方法についても説明しました。

要約すると、Flaskは、小規模な個人プロジェクトから大規模な商用アプリケーションまで、あらゆるサイズのWebアプリケーションを構築するのに最適な選択です。学びやすく、使いやすいだけでなく、多くの拡張機能を通じて高度な機能も提供します。

Flaskについてさらに学びたい場合は、以下の追加リソースが役立つかもしれません:

DjangoやFlaskについてさらに学び、それらの最適な使用例を知りたい場合は、Python Web Development with Django and Flaskをチェックアウトしてください。

Flask、Pythonフレームワークに関するFAQ

Flaskとは何ですか?

FlaskはPython用のマイクロウェブフレームワークです。軽量で使いやすさを重視しており、ウェブアプリケーションやAPIの開発に最適な選択肢です。

Flaskをインストールする方法は?

Pythonのパッケージマネージャであるpipを使用してFlaskをインストールできます。コマンドpip install Flaskを使用してシステムにFlaskをインストールしてください。

Flaskの主な特徴は何ですか?

Flaskはシンプルさ、柔軟性、そして最小主義で知られています。URLルーティング、リクエスト処理、テンプレートレンダリングなどの機能を提供しながら、開発者が必要に応じて他のコンポーネントを選択し統合できます。

Flaskは他のPythonウェブフレームワーク、例えばDjangoと比較してどうですか?

Flaskはマイクロフレームワークであり、一方DjangoはフルスタックのWebフレームワークです。Flaskはコンポーネントの選択に対してより柔軟性と自由度を提供しますが、Djangoは多くの組み込み機能と規約を備えています。

FlaskでRESTful APIを構築できますか?

はい、FlaskはRESTful APIの構築に適しており、そのシンプルさとHTTPメソッドのサポートにより、APIエンドポイントの作成に人気の選択肢です。

Flaskは大規模なWebアプリケーションに適していますか?

Flaskは大規模なアプリケーションに使用できますが、フルスタックフレームワーク(例えばDjangoなど)と比較して、より多くの手動設定と追加コンポーネントの統合が必要になる場合があります。

Source:
https://www.sitepoint.com/flask-introduction/