今回のお題
今回は、djangoのルーティングについてまとめます。
ルーティングファイルが2層構造になっていたり参考にした書籍と現在のトレンドが違ったり(書籍ではurlを用いていたが現在はpathが主流)と所々混乱する要素があったので、記事にすることで自分の頭を整理したいと思います。
目次
- djangonにおけるルーティングの概要
- プロジェクトフォルダのurls.pyの記述
- アプリケーションフォルダにおけるurls.pyの記述
- 終わりに
djangoにおけるルーティングの概要
djangoでは、ルーティングの定義に以下の2つのファイルが関わります。
- プロジェクトフォルダのurls.py
- アプリケーションフォルダのurls.py
名前が同じなのがややこしいですね。
役割分担としては、まずプロジェクトフォルダのurls.pyがリクエストのurlに応じて適切なアプリケーションのurls.pyを呼び出します。
その後、呼び出されたアプリケーションのurl.pyがリクエストに対応した関数をviews.pyから呼び出すという流れになります。
では、具体的な記述方法をみていきましょう。
プロジェクトフォルダのurls.pyの記述
まずは、プロジェクトフォルダのurls.pyを編集します。
ここでは、path()とinclude()を用いて「どのurlからのリクエストをどのアプリケーションのurls.pyに振り分けるか」及びそのルーティングのnamespaceを定義します(namespaceは省略可)。
以下では、mysiteというプロジェクトにおいて、myappから始まるurlへのリクエストをmyappというアプリケーションに振り分けています。
urlpatterns = [
path("myapp/", include("myapp.urls") # namespaceなし
ptath("myapp/", include(("myapp.urls", "myapp"))) # namespace
]
namespaceは必須ではありませんが、後述するルーティングのnameが衝突しないようにするためにはあったほうが便利かなと思います。
もしnamespaceを指定する場合には、include内の引数がタプル形式になることに注意してください。
タプルについてはこちら。
これでmyappから始まるurlをmyappというアプリケーションに振り分けることができました。
次に、アプリ内でのルーティングを設定していきます。
アプリケーションフォルダにおけるurls.pyの記述
先程のプロジェクトフォルダのurls.pyではurl(の前半部分)とアプリケーションを対応させました。
アプリケーションフォルダのurls.pyではurlの後半部分とviews.pyの関数を対応させていきます。
今回は例として、myapp/indexというurlへのリクエストとviews.pyのmyapp_index関数を対応させます。
urlpatterns = [
path("index/", views.myapp_index, name="myapp_index")
]
第一引数がurlです。
myapp/の部分まではプロジェクト側で処理しているので、それより後の部分だけを引数としていることに注意してください。
第二引数には呼び出す関数名をviews.関数名の形式で記述します。
第3引数にはルーティング名を指定しておくと、テンプレートでa要素のhref属性を指定する際などに利用できます。
ルーティングとしてはこれで終了です。
終わりに
こうして文字に起こしているとだいぶ整理できてきましたが、まだ若干怪しいです。
どちらがnameでどちらがnamespaceなのかなどはもちろん考えればわかるのですが、まだ身についているとは言えない状態ですね・・・