pythonとflaskで始めるwebサーバー構築完全ガイド

目次

第1章: はじめに

本書の目的

本記事はPythonの軽量Webフレームワーク「Flask」を使って、手軽にWebアプリを作るための実践的なガイドです。概要から基本操作、サンプルコード、導入方法、応用例まで、初心者が迷わず進めるよう丁寧に説明します。

対象読者

・Pythonの基本的な文法(変数、関数、簡単なモジュール操作)が分かる方
・初めてWebアプリを作る方、または軽量フレームワークを試したい方

本記事で学べること

・Flaskの特徴と利点
・インストールと環境設定の手順
・最初のWebアプリ(Hello, World!)作成
・ルーティングやテンプレートの使い方
・簡単なデータベース連携と公開方法
・応用例と実運用での注意点

進め方のおすすめ

実際に手を動かしながら読み進めてください。章ごとに短いサンプルを用意しますので、コピー&実行して動作を確かめると理解が深まります。

前提と準備

本記事ではPython 3系を前提とします。必要な環境は章ごとに案内しますので、まずはPythonが使える状態にしておくとスムーズです。

Flaskとは何か?特徴とメリット

概要

FlaskはPythonで書かれた軽量なWebアプリケーションフレームワークです。必要最低限の機能だけを持つ「マイクロフレームワーク」と呼ばれ、追加機能は拡張で組み合わせて使います。設計がシンプルで学習コストが低く、短期間で使い始められます。

主な特徴

  • シンプルな構造:ファイル数や設定が少なく、コードの流れが追いやすいです。
  • ルーティングとテンプレート:URLと処理を結び付けるルーティング、HTMLを簡単に扱えるテンプレートエンジン(Jinja2)を標準で備えます。
  • 拡張性:データベースや認証、API作成などは必要に応じて拡張パッケージを追加します。例:SQLAlchemyやFlask-Login。
  • 軽快な開発体験:内蔵の開発サーバーやデバッグ機能で試行錯誤がしやすいです。

簡単な例

以下のように数行で動くアプリが作れます。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello, Flask!'

メリットと適した用途

  • メリット:学びやすく、プロトタイプや小〜中規模アプリ、APIサーバー、マイクロサービスに向きます。柔軟に設計できるため既存の仕組みに組み込みやすいです。
  • 注意点:機能が多い大規模アプリでは開発ルールや構成を自分で整える必要があります。

Flaskのインストールとセットアップ

1. 前提

  • Python 3.6 以上が必要です。インストール済みか「python –version」で確認してください。
  • pip を使ってパッケージを入手します。

2. 仮想環境の作成(推奨)

プロジェクトごとに環境を分けると依存関係の衝突を避けられます。例:

python3 -m venv venv
# mac/linux
source venv/bin/activate
# Windows(PowerShell)
venv\Scripts\Activate.ps1

3. Flaskのインストール

仮想環境を有効にした状態で次を実行します。

pip install flask

4. 最小のアプリを作る

プロジェクト直下に app.py を作り、以下を記述します。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello, Flask!'

5. サーバーの起動

環境変数でアプリ名を指定して起動します。
– mac/linux:

export FLASK_APP=app.py
export FLASK_ENV=development  # 開発時のみ
flask run
  • Windows(PowerShell):
$env:FLASK_APP = "app.py"
$env:FLASK_ENV = "development"
flask run

ブラウザで http://127.0.0.1:5000/ にアクセスすると確認できます。

6. 便利なコマンド

  • 依存パッケージを保存: pip freeze > requirements.txt
  • 別の方法で起動: python -m flask run

7. よくあるつまずき

  • 仮想環境を有効にしていないと別のPythonにインストールされます。
  • ポートが既に使われていると起動に失敗します。別ポートは flask run --port 8000 で指定できます。

この章で環境を整えれば、次章で実際のアプリ作成に進めます。

最初のWebアプリケーション(Hello, World!)

概要

Flaskでは1ファイルから簡単にWebアプリを作れます。ここでは最も基本的な「Hello, World!」を作り、実行してブラウザで確認する手順を説明します。

コード例(app.py)

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)

実行手順

  1. 上の内容をapp.pyとして保存します。
  2. ターミナルで保存先に移動し、python app.pyを実行します。
  3. ブラウザでhttp://localhost:8000にアクセスすると「Hello, World!」が表示されます。

行ごとの説明

  • from flask import Flask:Flaskクラスを読み込みます。初心者はこの1行を覚えれば大丈夫です。
  • app = Flask(name):アプリケーションの本体(インスタンス)を作ります。
  • @app.route(‘/’):トップページ(/)にアクセスがあったときに下の関数を呼びます。
  • def index(): return ‘Hello, World!’:ブラウザに返す文字列を指定します。
  • app.run(…)
  • host=’0.0.0.0’はローカルネットワークからのアクセスを許可します。開発中は省略しても構いません。
  • port=8000でポート番号を指定します。

よくあるつまずきと対処

  • 既にポートが使われている:別のポート番号(例: 5000)に変えて再実行してください。
  • モジュールが見つからない:pip install flaskでインストールしてください。
  • ブラウザに反映されない:キャッシュやアドレスのタイプミスを確認してください。

次のステップ

ここまでで基本の動作が確認できます。次はルーティングやテンプレートを使ってページを増やしてみましょう。

ルーティングとテンプレート

ルーティングの基本

Flaskでは@routeデコレータでURLと関数を結びつけます。関数が呼ばれると、その関数が返す内容をブラウザに送ります。動的な部分は<…>で受け取れます(例: /user/)。

テンプレートの配置と使い方

HTMLファイルはtemplatesフォルダに入れます。render_template関数がテンプレートに変数を渡して、実際のHTMLを生成します。テンプレートはJinja2という簡単な書式を使い、{{ name }}のように変数を埋め込みます。

GETとPOSTの処理、リダイレクト

フォーム送信は主にPOSTを使います。ルートでmethods=[‘GET’,’POST’]と書くと両方対応します。POSTを受けたら値を取り出し、処理後にredirectとurl_forで別ページへ送ると安全です。

コード例

from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/login', methods=['GET','POST'])
def login():
    if request.method == 'POST':
        username = request.form.get('username')
        # 簡単な処理の例
        if username:
            return redirect(url_for('index'))
        return render_template('login.html', error='名前を入力してください')
    return render_template('login.html')

テンプレート例(templates/login.html)

<form method="post">
  <input name="username" placeholder="ユーザー名">
  <button type="submit">送信</button>
  {% if error %}<p>{{ error }}</p>{% endif %}
</form>

この構成で複数ページや動的な表示を分かりやすく作れます。テンプレートはHTMLの分離に役立ち、ルーティングはアプリの入口を整理します。

データベース連携

概要

FlaskはSQLite、MySQL、PostgreSQLなどと簡単に連携できます。小さな開発にはSQLite、本番や同時接続が多い場合はMySQL/PostgreSQLが向きます。データ操作にはSQLAlchemyというライブラリ(ORM)を使うと、Pythonのコードで扱えて便利です。

SQLAlchemyの基本例

下は記事(Article)をデータベースへ保存し、一覧をテンプレートに渡す最小の例です。

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy

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

class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(120))
    body = db.Column(db.Text)

@app.route('/')
def index():
    articles = Article.query.order_by(Article.id.desc()).all()
    return render_template('index.html', articles=articles)

テンプレート例

<!-- templates/index.html -->
{% for a in articles %}
  <h2>{{ a.title }}</h2>
  <p>{{ a.body }}</p>
{% endfor %}

補足

マイグレーション管理はFlask-Migrateを使うと安全です。テスト的に使うときはSQLite、運用はPostgreSQLなどに切り替えると使いやすいです。

サーバーの起動と公開

開発用サーバーの起動

開発中は内蔵サーバーで手早く動作確認できます。典型的には次のように起動します。

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

hostを0.0.0.0にすると同じネットワーク内の他端末からアクセスできます。停止はターミナルでCtrl+Cを押します。開発用サーバーは軽量で便利ですが、本番向けには作られていません。

本番環境での公開(推奨構成)

本番ではWSGIサーバー(例:gunicornやuWSGI)とリバースプロキシ(例:NginxやApache)を組み合わせます。WSGIがアプリを実行し、リバースプロキシが外部からの通信やTLSを処理します。こうすることで性能・安定性・セキュリティが向上します。

よくあるコマンド例(gunicorn):

gunicorn -w 4 -b 0.0.0.0:8000 myapp:app

-wはワーカー数(同時処理の目安)、-bはバインド先です。通常は127.0.0.1:8000で待ち受け、Nginxがproxy_passで受け渡します。

運用時の注意点

  • DEBUGモードは無効にしてください。機密情報が漏れる恐れがあります。
  • SECRET_KEYは安全に管理してください。
  • ログをファイルや外部サービスに出力して監視します。
  • サービスは非rootユーザーで実行し、systemdなどで自動起動を設定すると安定します。
  • 静的ファイルはNginxで直接配信すると高速です。

必要に応じてDockerやコンテナオーケストレーションを使う選択肢もありますが、基本は上の組み合わせで十分です。

応用例・拡張

RESTful APIの作成

Flaskは軽量なのでAPIの作成に向きます。エンドポイントを定義してJSONを返すだけで済むため、モバイルや他サービスとの連携が簡単です。例えばGETで一覧を返し、POSTでデータを作る、といった基本を押さえれば実用的なAPIが作れます。

JavaScript連携とフロントエンド(Vue.js / Vite)

フロント側はVue.jsやViteで開発し、APIをfetchで呼び出す構成が一般的です。テンプレートに直接埋め込む方法と、SPAとして分離して開発する方法の両方に対応します。ビルド済みファイルをFlaskの静的配下に置くだけで簡単に配信できます。

AI・チャットボットの組み込み

簡単なチャットボットやAI機能は、外部のAIサービスや自作モデルのAPIをFlask経由で呼び出して実装できます。リクエストを受けて非同期に処理する場合はCeleryなどのタスク隊列を使うと応答性が向上します。

主要な拡張機能

  • 認証: Flask-LoginやFlask-JWT-Extended
  • 管理画面: Flask-Admin
  • DB: SQLAlchemy(ORM)とFlask-Migrateでマイグレーション
  • バリデーション: Marshmallow
  • CORS対策やレート制限用の拡張も豊富です

実装のコツ

Blueprintで機能ごとに分け、拡張は用途に応じて追加してください。まず小さな機能から作り、需要に応じて認証や非同期処理を追加すると運用が楽になります。

Flaskが向いている用途と注意点

向いている用途

  • 小〜中規模のWebアプリ:ブログ、管理画面、ダッシュボードなどを短期間で作れます。具体例:社内ツールやプロトタイプ。
  • APIサーバー:シンプルなREST APIやマイクロサービスに適します。モバイルアプリのバックエンドなど。
  • 学習・実験:Webの仕組みを学ぶのに分かりやすいです。

注意点

  • セキュリティ:秘密鍵やセッション設定、入力の検証、認証・認可は自分で注意深く実装してください。HTTPSやレート制限、CSRF対策も必要です。
  • スケーラビリティ:単一プロセスでは限界があります。GunicornなどのWSGIサーバーやロードバランサー、DBの接続プール、キャッシュ導入を検討してください。
  • プロジェクト構成:規模が大きくなると構造化(Blueprintやパッケージ化、テスト整備)が必要です。拡張機能は豊富ですが、選定と保守は開発者の責任です。

選び方の目安

短期間で動くもの、学習、API中心ならFlaskをおすすめします。大規模で認証や管理画面が多い場合は他のフレームワークも検討してください。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

目次