最近、先輩から引き継がれたシステムの開発を担当することになりました。
そこでDjango(ジャンゴ)を使用しているのですが、GUI上でしか触ったことがなく「Django(ジャンゴ)=データベース(DB)」という大きな勘違いをしていたため、備忘録として整理しておきます。
Django は、Python で Web サイトや Web アプリを作るための土台=Web アプリケーションフレームワークです。
1. 【超・大前提】 Django と データベース(DB)の違い
データベース(DB / 例: MySQL, PostgreSQL, Oracle など)
- ディスク上にテーブル構造でデータを保存・管理し、SQL文(
SELECT,INSERTなど)を受け取ってデータを読み書きする専用のソフトウェア。 - 比喩)データの保管庫
Django
- サーバー上で動いている Python 製の Web アプリケーション実行基盤(フレームワーク)。アプリの作り方や構成を標準化するための仕組み。
- 標準化されることで、コードを読みやすくなったり、保守性が上がって引き継ぎやすくなったり、開発品質を揃えたりしやすくなる。
- 主な役割は、ブラウザから送られてくる HTTP リクエストを受け取り、必要な処理を行って、HTML などの HTTP レスポンスを返すこと。
- 比喩)保管庫からデータを取り出したり、計算したり、画面(HTML)を作ってブラウザに返す裏側のプログラム(店員・料理人)。
Django は DB そのものではなく、HTTP リクエストを受け取り、必要に応じて DB と連携しながら HTML や JSON などのレスポンスを返すための Web フレームワークです。
たとえば次のように書けます。
Items.objects.filter(...)
実際には、こうした ORM の記述が必要に応じて SQL に相当する問い合わせへ変換され、DB からデータを取得します。
私はこの仕組みを見て最初「Django は DB に近いものなのかも」と感じましたが、整理してみると Django は DB そのものではなく、DB を使って Web アプリを動かすための枠組みでした。
2. 例:URLに対応する index ビューを呼ぶ
1. アクセス(注文)
ブラウザが「http://.../index を見せて!」とサーバーにリクエスト。
2. Django が URL を確認(案内係)
Django は urls.py という設定ファイル(ルール一覧)を見ます。
たとえば、Django では URL と処理を次のように対応づけます。
(※ ここでは最近の Django の書き方に寄せています)
from django.urls import path
from . import views
urlpatterns = [
path('index/', views.index, name='index'),
]
この設定があると、/index/ へのアクセス時に views.py の index 関数が呼ばれます。
つまり Django は、アクセスされた URL に応じて、対応する Python の処理を選んで実行しており、この一連の流れは「ビューを呼ぶ」と言うことが多いみたいです。
3. ビュー関数が実行される(料理人が動く)
views.py の index 関数が動きます。
def index(request):
# 1. DB から公開中の記事一覧を取得する
items = Item.objects.filter(status='published')
# 2. テンプレートにデータを渡して HTML を返す
return render(request, 'index.html', {
'items': items,
})
4. 画面が完成してブラウザに届く
DB から取ってきたデータが埋め込まれた完成版の HTML がブラウザに返され、画面が表示されます。
まとめ
- Django は DB ではなく、Web サーバー側で動く Python のシステム(枠組み)
- 「ビューを呼ぶ」とは、ブラウザからリクエストされた URL に応じて、指定された Python の処理(関数)を実行すること