Django
URLルーティング
サーチ…
Djangoがリクエストを処理する方法
Djangoは、受信URLパスをビュー関数にルーティングすることによってリクエストを処理します。ビュー関数は、要求を行うクライアントに応答を返す責任があります。異なるURLは、通常、異なるビュー機能によって処理されます。リクエストを特定のビュー関数にルーティングするために、DjangoはURL設定(またはURLconf)を調べます。デフォルトプロジェクトテンプレートは<myproject>/urls.py
URLconfを定義し<myproject>/urls.py
。
あなたのURLconfは、 urlpatterns
django.conf.urls.url()
インスタンスのリストであるurlpatterns
という名前の属性を定義するpythonモジュールでなければなりません。各url()
インスタンスは、少なくとも、URLと照合する正規表現 (正規表現)と、ビュー関数または別のURLconfのいずれかのターゲットを定義する必要があります。 URLパターンがビュー機能をターゲットにしている場合は、あとでパターンを簡単に参照するための名前を付けることをお勧めします。
基本的な例を見てみましょう:
# In <myproject>/urls.py
from django.conf.urls import url
from myapp.views import home, about, blog_detail
urlpatterns = [
url(r'^$', home, name='home'),
url(r'^about/$', about, name='about'),
url(r'^blog/(?P<id>\d+)/$', blog_detail, name='blog-detail'),
]
このURLconfは3つのURLパターンを定義します。すべてがview、 home
、 about
およびblog-detail
です。
-
url(r'^$', home, name='home'),
正規表現には開始アンカー '^'が含まれ、すぐに終了アンカー '$'が続きます。このパターンは、URLパスが空の文字列である要求と一致し、 myapp.views
定義されたhome
ビューにmyapp.views
ます。
-
url(r'^about/$', about, name='about'),
この正規表現には開始アンカーが続き、その後にabout/
、およびアンカーのリテラル文字列が続きます。これはURL /about/
と一致し、 about
ビューにルーティングされます。すべての空でないURLは/
で始まるので、Djangoは最初のスラッシュを簡便に削除します。
-
url(r'^blog/(?P<id>\d+)/$', blog_detail, name='blog-detail'),
この正規表現は少し複雑です。前のパターンと同様に、開始アンカーとリテラル文字列blog/
定義します。次の部分(?P<id>\d+)
は、キャプチャグループと呼ばれます。キャプチャグループは、その名前のように、文字列の一部をキャプチャし、Djangoはキャプチャした文字列を引数としてビュー関数に渡します。
キャプチャグループの構文は(?P<name>pattern)
です。 name
はグループの名前を定義します。これは、Djangoが引数をビューに渡すために使用する名前でもあります。パターンは、グループによって一致する文字を定義します。
この場合、名前はid
、その機能blog_detail
パラメータの名前受け入れなければならないid
。パターンは\d+
です。 \d
はパターンが数字だけに一致することを示します。 +
は、パターンが1つ以上の文字と一致しなければならないことを示します。
いくつかの一般的なパターン:
パターン | のために使用される | マッチ |
---|---|---|
\d+ | id | 1つ以上の数字 |
[\w-]+ | スラグ | 1つ以上の英数字、アンダースコアまたはダッシュ |
[0-9]{4} | 年(長い) | 4つの数字、0から9 |
[0-9]{2} | 年(短い) 月 月の日 | 2つの数字、0から9 |
[^/]+ | パスセグメント | スラッシュ以外のもの |
blog-detail
パターンのキャプチャグループの後にはリテラル/
とアンカーが続きます。
有効なURLは次のとおりです。
-
/blog/1/ # passes id='1'
-
/blog/42/ # passes id='42'
無効なURLは次のとおりです。
-
/blog/a/ # 'a' does not match '\d'
-
/blog// # no characters in the capturing group does not match '+'
Djangoは、彼らがで定義されている同じ順序で各URLパターンを処理urlpatterns
。複数のパターンが同じURLに一致する場合は、これが重要です。例えば:
urlpatterns = [
url(r'blog/(?P<slug>[\w-]+)/$', blog_detail, name='blog-detail'),
url(r'blog/overview/$', blog_overview, name='blog-overview'),
]
上記のURLconfでは、2番目のパターンに到達できません。パターンはURL /blog/overview/
と一致しますが、 blog_overview
ビューを呼び出す代わりに、URLはまずblog-detail
パターンと一致し、 blog_detail
ビューを引数slug='overview'
呼び出しslug='overview'
。
URL /blog/overview/
がblog_overview
ビューにルーティングされるようにするには、パターンをblog-detail
パターンの上に配置する必要があります。
urlpatterns = [
url(r'blog/overview/$', blog_overview, name='blog-overview'),
url(r'blog/(?P<slug>[\w-]+)/$', blog_detail, name='blog-detail'),
]
再利用可能なアプリケーションのURL名前空間を設定する(Django 1.9以降)
app_name
属性を設定して、URL名前空間を自動的に使用するようにアプリのURLconfを設定します。
# In <myapp>/urls.py
from django.conf.urls import url
from .views import overview
app_name = 'myapp'
urlpatterns = [
url(r'^$', overview, name='overview'),
]
これにより、ルートURLconf>にアプリケーション名空間が含まれている場合、 アプリケーションの名前空間が'myapp'
に設定されます 。再利用可能なアプリのユーザーは、URLを含む以外の設定を行う必要はありません。
# In <myproject>/urls.py
from django.conf.urls import include, url
urlpatterns = [
url(r'^myapp/', include('myapp.urls')),
]
再利用可能なアプリケーションは、アプリケーションの名前空間を使用してURLをリバースできるようになりました。
>>> from django.urls import reverse
>>> reverse('myapp:overview')
'/myapp/overview/'
rootのURLconfは、 namespace
パラメータでインスタンスの名前空間を設定できます。
# In <myproject>/urls.py
urlpatterns = [
url(r'^myapp/', include('myapp.urls', namespace='mynamespace')),
]
アプリケーションの名前空間とインスタンスの名前空間の両方を使用してURLを逆転できます。
>>> from django.urls import reverse
>>> reverse('myapp:overview')
'/myapp/overview/'
>>> reverse('mynamespace:overview')
'/myapp/overview/'
インスタンス名前空間は、明示的に設定されていない場合、デフォルトでアプリケーション名前空間になります。