サーチ…


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、 homeaboutおよび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/'

インスタンス名前空間は、明示的に設定されていない場合、デフォルトでアプリケーション名前空間になります。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow