pythonのwebフレームワークとして有名なものとして、DjangoとFlaskが挙げられます。webで検索すると、しばしばDjangoよりもFlaskの方が手軽であるという説明がよく見受けられます。
そこで本記事では、両フレームワークを用いてブラウザ画面に”Hello, World”の文字を表示するまでの手順を比較し、どの程度手軽さの違いがあるのか確認してみたいと思います。
本記事でわかること
- Djangoを用いてブラウザに文字を表示する方法
- Flaskを用いてブラウザに文字を表示する方法
- DjangoとFlaskの比較
実行環境
- macOS Monterey (M1チップ)
- conda 4.10.3
- Python 3.10
Flaskの場合
以下のステップを踏んでいきます。
- 仮想環境の構築とライブラリのインストール
- Flaskを扱う.pyファイルの作成
- ブラウザに表示する.htmlファイルの作成
1. 仮想環境の構築とライブラリのインストール
condaを用いて仮想環境を作成します。
conda create -n flask #仮想環境を新規作成
conda activate flask #仮想環境を起動
conda install -c anaconda flask #flaskをインポート
condaを用いたflaskのインストール方法について
以下、この仮想環境の中で作業を進めていきます。
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行目でflaskからFlaskクラス, render_templateクラスをインポートします
- 2行目でFlaskクラスのインスタンスを作成します
route
デコレータで、付随する関数を起動するか否かを制御しますhello_world()関数
はブラウザに表示する内容を返します
このコードは以下のFlask公式ドキュメントを参考にしています。
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をブラウザにコピペして、
ブラウザに文字が表示できました。
Djangoの場合
ステップ自体はFlaskの場合と大体同じです。
- 仮想環境の構築とライブラリのインストール
- djangoを扱う.pyファイルの作成
- ブラウザに表示する.htmlファイルの作成
- ルーティング・パスに関する記述の追記
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 です。
- hello/urls.py
- 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をブラウザにコピペして、
無事表示することができました。
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の比較記事を見て、どのくらい手軽さが異なるのかを比較しました。
実際に手を動かしてみることで、手軽さの程度の違いを体感できてとても勉強になりました。
何かしら参考になれば幸いです。
本記事執筆にあたり、以下の記事・書籍を参考にしました。
コメント