djangoでコードを打っていると、ルートディレクトリはどこなの?って思うことがありますよね。
そこで今回は、djangoでのルートディレクトリの場所を理解していきましょう。
ルートディレクトリは、プロジェクトのurls.pyファイルである
ルートディレクトリは、ドメイン名でアクセスした時にどの場所を指示しているのかということです。
例えば、アパッチというウェブサーバーの場合は/var/www/htmlが一般的なルートディレクトリです。
yahoo.co.jpというurlをリクエストした場合、yahoo.co.jpに紐づいているウェブサーバーの中にある/var/www/htmlというフォルダをまず参照するということです。
そして、djangoの場合、ルートディレクトリはプロジェクトのurls.pyファイルです。
ただ、これだけではよくわからないですよね。
ですので、順を追って解説していきます。
djangoでは、ブラウザにどのようなurlを入れても、まずは同じファイルが参照される。
djangoと普通のウェブブラウザでは、その仕組みが根本的に異なります。
ポイントは、djagnoではどのurlがリクエストされても、まずは同じファイルが参照されるということです。
これをしっかりと理解するために、まずは普通のウェブブラウザでのurlとディレクトリの仕組みをみていきましょう。
ウェブブラウザでのディレクトリ
1. https://abc.com/news.htmlの場合
まずは、https://abc.com/news.htmlファイルにアクセスをした場合です。
この場合、ウェブブラウザはnews.htmlファイルを取り出します。以下のイメージで確認しましょう。
news.htmlファイルを下さい。というリクエストが送られると、サーバーの中に入っているnew.htmlファイルが取り出され、それがブラウザに返されます。
2. https://abc.com/blog/apple.htmlの場合
次に、上記のようなファイルへのリクエストがあった場合を考えてみましょう。
この場合は、ウェブサーバーはblogフォルダの中のapple.htmlファイルをブラウザに返します。
この場合、news.htmlファイルは関係ありません。
blogフォルダの中の、apple.htmlファイルが取り出され、ブラウザにレスポンスが返されます。
まずはウェブサーバーのこのようなイメージ(1対1というイメージが分かりやすいかと思います)を固めましょう。
djangoでのディレクトリ
次に、djangoでのファイルの扱いについてみていきましょう。
djangoでは、いかなるurlであっても、プロジェクトフォルダのurls.pyファイルがまず参照されます。
例えば、https://abc.com/news.htmlというurlの場合は、このようなイメージです。
次に、https://abc.com/blog/apple.htmlというurlをリクエストしたとしましょう。その場合はこのようになります。
先ほどの場合と同じですね。これがポイントです。
どんなurlが来ても、その内容に応じてviews.pyに振り分ける
結局のところ、いかなるurlがきたとしても、urls.pyファイルがまずはすべてのurlを受け止め、処理をします。
この仕組みは、一般的なウェブサーバーとは異なります。
ですので、ウェブサーバーになじみが深いと、djangoのルートディレクトリはurls.pyファイルというイメージがわきづらいのです。
djangoの場合、urls.pyファイルがまずはリクエストを受けて、そのリクエストの内容に応じて次に呼び出す内容をコントロールしているのです。
ルートディレクトリを変えることはできる?
ちなみに、ルートディレクトリを変えることはできるのでしょうか?
答えは「できる」です。
settings.pyファイルをみてみましょう。
コードROOT_URLCONF = [xxx.urls]
このようなコードが書かれているかと思います。
このROOT_URLCONFこそがルートディレクトリ(ブラウザでリクエストが送られたときに参照するurls.pyファイル)なのです。
このROOT_URLCONFのxxxの部分を任意のアプリに変えれば、ルートディレクトリを変更することができます。
普通はルートディレクトリを変えることはありませんが、参考程度に頭に入れておくと良いかもしれません。
ルートディレクトリのまとめ
(1) djangoでのルートディレクトリはurls.pyである。
(2) なぜなら、settings.pyのROOT_URLCONFでそのように設定しているから。
(3) つまり、ROOT_URLCONFを変更することで、ルートディレクトリを変えることが可能。