※このブログではサーバー運用、技術の検証等の費用のため広告をいれています。
記事が見づらいなどの問題がありましたらContactからお知らせください。

<前のページ
【初心者チュートリアル】Django2でブログ作成(Part8)〜View関数の作成~
次のページ>
【初心者チュートリアル】Django2でブログ作成(Part10)〜templateの作成~

【初心者チュートリアル】Django2でブログ作成(Part9)〜URLconfの作成~

web開発 python3 Django python Djangoチュートリアル

投稿日:2019年11月9日

このエントリーをはてなブックマークに追加
Djangoは簡単にWebアプリケーションを作成できるフレームワークです。この記事は初心者の方向けのDjangoチュートリアルです。

はじめに

前回(Part8)の記事では簡単なview関数を作成しました。今回のPartでは、HttpRequestオブジェクトをそのURLごとに適切なview関数へマッピングするURLconf(URL configuration)を作成していきます。


URLconf

URLConfとは?

URLconf(URL configuration)とはHTTPRequestオブジェクトを受け取り、それをurlごとに適切なview関数にマッピングするPythonモジュールのことを言います。どのファイルをURLconfとして読みに行くかは設定ファイル(settings.py)でROOT_URLCONFとして設定されています。たいていの場合、これはプロジェクト作成時にプロジェクト直下にあるurls.pyになっていて、特に理由がない限りこれを変える必要はないでしょう。

sample_blog/sample_blog/settings.py
[...]
ROOT_URLCONF = 'sample_blog.urls'
[...]

URLのマッチングで正規表現でマッチした値については位置引数として渡されます。

URLConfを作成してみよう

これからURLconfを作成していくのですが、まずURLの管理方法を説明します。まず全てのHttpRequestオブジェクトを受け取る入り口の役目を持つROOTのURLconfでどのアプリケーションのURLかをパターンマッチングし、適切なアプリケーションディレクトリ内のURLconfに渡しそちらに残りのパターンマッチングを引き継いでもらうような構成にします。

この管理方法はDjango側で推奨されている方法です。他のフレームワークではURLconfというのは煩雑になりがちなのですが、Djangoはこの様な分割のおかげで管理がとてもしやすくなってます。

ではまずはアプリケーション側のURLconfを作成blogディレクトリに新しくurls.pyファイルを作成し以下の様に編集してみましょう。

sample_blog/blog/urls.py
from django.urls import path
from . import views                       # view関数のimport

app_name = 'blog'                        # app_name

urlpatterns = [
    path('' views.article_list, name='article_list'),
    path('<int:id>/',
         views.article_detail,
         name='article_detail'),
]

まず簡単に解説していきます。

まずapp_nameという値を定義をしています。この様にapp_nameを定義したURLconfはDjangoのアプリケーション内でその名前で参照することができます。詳しくは次のPartのtemplateの項で詳しく説明します。

DjangoはURLconfをみに行くときにそのモジュールの中のurlpatternsを探します。マッピングの定義はこのurlpatternspath()re_path()というマッピング用の関数のリストで定義されます。

まずはじめにarticle_list()へのマッピングについてです。django.urls.path()関数は第一引数にURLのパターンを文字列で受け取り、第2引数に渡す先のview関数を受け取ります。1つめのpath('' views.article_list, name='article_list')ではこのURLconfに送られたルートのURLのHTTPRequestオブジェクトをそのままviewsのarticle_list()関数に送るようマッピングされています。またオプションの引数としてname引数を受け取っています。Djangoのアプリケーション内ではapp_nameとこのnameでどのURLのマッピングかの参照ができます。これも詳しくは次のPartで説明。

次にarticle_detail()へのマッピングです。ここではURLの中にブラケット(<>の記号)が使われています。path()メソッドではブラケットで以下の様に定義した値に関してはそれをview関数に追加で渡すことができるのです。

<値の型:viewに渡す際のキー>

つまり今回の場合、例えばhttp://〇〇.com/blog/12/の様なURLにリクエストが送られた時article_detail()関数はHttpRequestオブジェクトに加えてid=12という引数を受け取れるということになります。

※今回はデバッグのしやすさとわかりやすさのためにURLにidを使いましたが、実はこれはセキュリティ的にタブーになっています。これについては少し後のPartで解説します。

では次にROOTのURLconfを編集してみましょう

sample_blog/sample_blog/urls.py
from django.urls import path, include
from django.contrib import admin

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

ここでは新しくinclude()という関数が出てきています。この関数は単純にそのurlに着たHTTPRequestオブジェクトを別のURLconfに渡す仲介の様な役目をしています。

オプションの引数として、namespaceを渡しています。Djangoアプリケーションではこのnamespacename引数の値を使ってURLの名前解決ができるのです。

例えばhttp://〇〇.com/blog/article_listの様なURLを"blog:article_list"の様に参照できるのです。

わからない部分は公式のドキュメントを参照しましょう。

re_path()関数

このPartでは使用しませんでしたが複雑なURLの定義が必要になった時にはdjango.url.re_path()関数を使用しましょう。この関数はURLに正規表現が使用できます。詳しくは公式のドキュメントを参照してください。


さいごに

まとめ

  • URLのマッピングはプロジェクト、アプリケーションのurls.py内のurlspatternsに記述します。
  • django.urls.path()関数にはURLview関数、必要ならnameを渡します。
  • 正規表現を使用したい時にはdjango.urls.re_path()関数を使用します。
  • URLの名前解決機能を使うためにはアプリケーション名としてapp_namenamespace、url名としてnameを指定します。
  • ROOTのURLconfから他のURLconfに経由したいときにはdjango.urls.include()関数を使う。
このエントリーをはてなブックマークに追加

<前のページ
【初心者チュートリアル】Django2でブログ作成(Part8)〜View関数の作成~
次のページ>
【初心者チュートリアル】Django2でブログ作成(Part10)〜templateの作成~

関連記事

記事へのコメント
7:名無しさん
2021年12月7日16:55

sample_blog/blog/urls.py内の
path('' views.article_list, name='article_list'),

path('', views.article_list, name='article_list'),
であると思われます。