[Django vs. Flask] “Hello, World”までの道のりを比較する

記事内に広告が含まれています。

pythonのwebフレームワークとして有名なものとして、DjangoとFlaskが挙げられます。webで検索すると、しばしばDjangoよりもFlaskの方が手軽であるという説明がよく見受けられます。

そこで本記事では、両フレームワークを用いてブラウザ画面に”Hello, World”の文字を表示するまでの手順を比較し、どの程度手軽さの違いがあるのか確認してみたいと思います。

本記事でわかること

  • Djangoを用いてブラウザに文字を表示する方法
  • Flaskを用いてブラウザに文字を表示する方法
  • DjangoとFlaskの比較

実行環境

  • macOS Monterey (M1チップ)
  • conda 4.10.3
  • Python 3.10

Flaskの場合

以下のステップを踏んでいきます。

  1. 仮想環境の構築とライブラリのインストール
  2. Flaskを扱う.pyファイルの作成
  3. ブラウザに表示する.htmlファイルの作成

1. 仮想環境の構築とライブラリのインストール

condaを用いて仮想環境を作成します。

conda create -n flask           #仮想環境を新規作成
conda activate flask            #仮想環境を起動
conda install -c anaconda flask #flaskをインポート

condaを用いたflaskのインストール方法について

Flask :: Anaconda.org

以下、この仮想環境の中で作業を進めていきます。

mkdir flaskproject          #作業ディレクトリの新規作成
cd flaskproject
touch hello.py              # .pyファイルを作成
mkdir templates             #htmlファイルを管理するディレクトリ
touch tempaltes/hello.html  #htmlファイルを作成

作業ディレクトリ flaskproject を新規作成して、hello.pyを作成します。このファイルにFlaskのコードを書き込んでいきます。

ディレクトリのツリー構造は、以下の通りです。

flaskproject
    ├── hello.py
    └── templates
        └── hello.html

2. Flaskを扱う.pyファイルの作成

hello.py に以下のコードを記入します。

#hello.py
from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def hello_world():
    return render_template('hello.html')

if __name__ == "__main__":
    app.run()
  1. 1行目でflaskからFlaskクラス, render_templateクラスをインポートします
  2. 2行目でFlaskクラスのインスタンスを作成します
  3. route デコレータで、付随する関数を起動するか否かを制御します
  4. hello_world()関数 はブラウザに表示する内容を返します

このコードは以下のFlask公式ドキュメントを参考にしています。

クイックスタート — Flask Documentation (2.2.x)

3. ブラウザに表示する.htmlファイルの作成

<!DOCTYPE html>
<html lang="ja">
    <head>
        <title>flaskでhello,world</title>
        <meta charset="utf-8"/>
    </head>
    <body>
        <p>Hello, World</p>
    </body>
</html>

実際に動かしてみる

ターミナル上で、

python hello.py

表示されるURLをブラウザにコピペして、

図1: Flaskを用いてブラウザに Hello,World を表示

ブラウザに文字が表示できました。

Djangoの場合

ステップ自体はFlaskの場合と大体同じです。

  1. 仮想環境の構築とライブラリのインストール
  2. djangoを扱う.pyファイルの作成
  3. ブラウザに表示する.htmlファイルの作成
  4. ルーティング・パスに関する記述の追記

1. 仮想環境の構築とライブラリのインストール

conda create -n django          #仮想環境を新規作成
conda activate django           #仮想環境を起動
conda install django            #djangoライブラリをインポート

次に、作業ディレクトリ djangoproject を作成してdjangoのセットアップを行います。

mkdir djangoproject
cd djangoproject
django-admin startproject project

すると、djangoproject下に以下のディレクトリが生成されます。

project
    ├── manage.py         #サーバ起動など様々な操作を実行するファイル
    └── project
        ├── __init__.py
        ├── asgi.py
        ├── settings.py   #djangoプロジェクトの設定ファイル
        ├── urls.py       #djangoプロジェクトのURL宣言
        └── wsgi.py

各ファイルについては公式ドキュメントにも記載があるのでご確認ください。

この時点でFlaskよりも複雑な構造になりましたが、とりあえず先に進みます。

2. djangoを扱う.pyファイルの作成

次にdjangoアプリケーションファイルを作成します。Flaskの場合は自分でhello.pyを作成しましたが、djangoの場合は規定のコマンドで作成します。manage.pyが存在するディレクトリにて、

python manage.py startapp hello

すると、manage.py下に以下のようなディレクトリとファイルが生成されます。

├── hello
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   └── __init__.py
    ├── models.py         #データベース関連
    ├── tests.py
    └── views.py          #アプリケーション本体(httpを受けてレスポンスする機能を記述)

このうち、views.py を記述していきます。

from django.shortcuts import render

def index(request):
    return render("hello.html")

3. ブラウザに表示する.htmlファイルの作成

manage.pyと同じ階層にtemplatesディレクトリを作成し、この下にhtmlファイルを管理します。

mkdir templates  #manage.pyと同じ階層
touch templates/hello.html

このtemplates ディレクトリをアプリケーション側に認識させるため、project/settings.pyに追記します。

#...省略...
TEMPLATE_DIR = BASE_DIR / "Template"    #<-ここを追記
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [TEMPLATE_DIR],         #<-ここを追記
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                ...省略...
]

そして、hello.htmlの中身を記述します。

<!DOCTYPE html>
<html lang="ja">
    <head>
        <title>flaskでhello,world</title>
        <meta charset="utf-8"/>
    </head>
    <body>
        <p>Hello, World</p>
    </body>
</html>

4. ルーティング・セッティングに関する記述の追記

記述するファイルは2つの urls.py です。

  1. hello/urls.py
  2. project/urls.py

1個目のファイルはデフォルトでは存在しないので、自分で新規作成する必要があることに注意してください。

1つ目のurls.py (hello/urls.py)

ブラウザからのリクエストに反応するルーティングを記述するファイルを作成します。views.pyが存在するディレクトリと同じ位置にurls.pyを作成します。

touch urls.py    #hello/views.pyと同じ階層

この urls.py に

from django.urls import path
from . import views
urlpatterns = [
    path('', views.index, name='index'),
]

2つ目のurls.py (project/urls.py)

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('hello.urls')),
]

実際に動かしてみる

manage.pyと同じ階層にて、以下のコマンドを実行する

python manage.py runserver

起動後に表示されるURLをブラウザにコピペして、

図2 Djangoを用いて Hello, World を表示する

無事表示することができました。

FlaskとDjangoを比較

(以下、初学者の私の主観的な感想です。ご注意ください。)

作成したディレクトリの複雑さ

圧倒的にFlaskの方が簡単です。

#今回作成したflaskのディレクトリ構成
flaskproject
├── hello.py
└── templates
    └── hello.html
#今回作成したdjangoのディレクトリ構成
djangoproject
└── project
    ├── db.sqlite3
    ├── hello
    │   ├── __init__.py
    │   ├── __pycache__
    │   ├── admin.py
    │   ├── apps.py
    │   ├── migrations
    │   ├── models.py
    │   ├── tests.py
    │   ├── urls.py
    │   └── views.py
    ├── manage.py
    ├── project
    │   ├── __init__.py
    │   ├── __pycache__
    │   ├── asgi.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    └── templates
        └── hello.html

ルーティングについて

Flaskはデコレータ@ を用いてルーティングを記述するため、どのURLがどの関数を呼び出すのかがわかりやすいと感じました。

#デコレータと関数が近くて対応関係が捉えやすい
@app.route("/")
def hello_world():
    return render_template('hello.html')

対して、dangoは関数を記述するファイル views.py とルーティングを記述するファイル urls.py が別々になっており、初学者の私にはわかりにくく感じました。

Djangoの良さそうな部分

Djangoはルールがぎちぎちな分、コードが長くなってもエラーに起因する部分のアタリをつけやすいのではないかとも感じました。(「ルーティングに関するエラーっぽいから urls.pyを重点的に見れば良さそう~」 とか。)

まとめと参考

DjangoとFlaskの比較記事を見て、どのくらい手軽さが異なるのかを比較しました。

実際に手を動かしてみることで、手軽さの程度の違いを体感できてとても勉強になりました。

何かしら参考になれば幸いです。

本記事執筆にあたり、以下の記事・書籍を参考にしました。

Django
The web framework for perfectionists with deadlines.
クイックスタート — Flask Documentation (2.2.x)

コメント