Django-url-mapping
Django-URLマッピング
これで、前の章で説明した作業ビューができました。 URLを介してそのビューにアクセスする必要があります。 DjangoにはURLマッピングのための独自の方法があり、プロジェクトのurl.pyファイル*(myproject/url.py)*を編集することによって行われます。 url.pyファイルは次のようになります-
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
#Examples
#url(r'^$', 'myproject.view.home', name = 'home'),
#url(r'^blog/', include('blog.urls')),
url(r'^admin', include(admin.site.urls)),
)
ユーザーがWebアプリのページをリクエストすると、Djangoコントローラーが引き継いでurl.pyファイルを介して対応するビューを探し、見つからない場合はHTML応答または404 not foundエラーを返します。 url.pyで最も重要なのは "urlpatterns" タプルです。 URLとビューの間のマッピングを定義する場所です。 マッピングは、次のようなURLパターンのタプルです-
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
#Examples
#url(r'^$', 'myproject.view.home', name = 'home'),
#url(r'^blog/', include('blog.urls')),
url(r'^admin', include(admin.site.urls)),
url(r'^hello/', 'myapp.views.hello', name = 'hello'),
)
マークされた行は、URL "/home"をmyapp/view.pyファイルで作成されたhelloビューにマッピングします。 上記のように、マッピングは3つの要素で構成されています-
- パターン-解決およびマップするURLに一致する正規表現。 python 're’モジュールで動作するすべてのものがパターンに適格です(URL経由でパラメーターを渡す場合に便利です)。
- ビューへのPythonパス-モジュールをインポートするときと同じです。
- 名前-URLリバーシングを実行するには、上記の例で行われた名前付きURLパターンを使用する必要があります。 完了したら、サーバーを起動してビューにアクセスします:http://127.0.0.1/hello
URLを整理する
これまで、「myprojects/url.py」ファイルにURLを作成しましたが、Djangoとアプリの作成について前述したように、最良のポイントは異なるプロジェクトでアプリケーションを再利用できるようにすることでした。 すべてのURLを「projecturl.py」ファイルに保存すると、問題が簡単にわかります。 したがって、ベストプラクティスは、アプリケーションごとに「url.py」を作成し、それをメインプロジェクトのurl.pyファイルに含めることです(以前に管理インターフェイスの管理URLを含めました)。
どうですか?
私たちは、次のコードを使用してmyappでurl.pyファイルを作成する必要があります-
from django.conf.urls import patterns, include, url
urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'),)
その後、myproject/url.pyは次のように変更されます-
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
#Examples
#url(r'^$', 'myproject.view.home', name = 'home'),
#url(r'^blog/', include('blog.urls')),
url(r'^admin', include(admin.site.urls)),
url(r'^myapp/', include('myapp.urls')),
)
myappアプリケーションのすべてのURLが含まれています。 「/hello」を介してアクセスされたホームルは「/myapp/hello」になりました。これは、Webアプリにとってよりよく理解しやすい構造です。
ここで、myapp“ morning”に別のビューがあり、myapp/url.pyにマップしたい場合、myapp/url.pyを次のように変更します。
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'^hello/', 'myapp.views.hello', name = 'hello'),
url(r'^morning/', 'myapp.views.morning', name = 'morning'),
)
これはリファクタリングすることができます-
from django.conf.urls import patterns, include, url
urlpatterns = patterns('myapp.views',
url(r'^hello/', 'hello', name = 'hello'),
url(r'^morning/', 'morning', name = 'morning'),)
ご覧のとおり、 urlpatterns タプルの最初の要素を使用しています。 これは、アプリ名を変更する場合に便利です。
ビューへのパラメーターの送信
URLをマップする方法、それらを整理する方法、そしてビューにパラメーターを送信する方法を見てみましょう。 古典的なサンプルは記事の例です(「/articles/article_id」から記事にアクセスしたい)。
パラメータの受け渡しは、URLパターンで regexp を使用してキャプチャすることにより行われます。 「myapp/view.py」に次のようなビューがある場合
from django.shortcuts import render
from django.http import HttpResponse
def hello(request):
return render(request, "hellol", {})
def viewArticle(request, articleId):
text = "Displaying article Number : %s"%articleId
return HttpResponse(text)
「/myapp/article/articleId」からアクセスできるようにmyapp/url.pyにマッピングしたいので、「myapp/url.py」に次のものが必要です-
from django.conf.urls import patterns, include, url
urlpatterns = patterns('myapp.views',
url(r'^hello/', 'hello', name = 'hello'),
url(r'^morning/', 'morning', name = 'morning'),
url(r'^article/(\d+)/', 'viewArticle', name = 'article'),)
Djangoがurlを表示するとき:“/myapp/article/42”それはviewArticleビューにパラメーター '42’を渡し、ブラウザーで次の結果を得るはずです-
ここではパラメーターの順序が重要であることに注意してください。 1年の1か月の記事のリストが必要な場合、viewArticlesビューを追加しましょう。 view.pyは次のようになります-
from django.shortcuts import render
from django.http import HttpResponse
def hello(request):
return render(request, "hellol", {})
def viewArticle(request, articleId):
text = "Displaying article Number : %s"%articleId
return HttpResponse(text)
def viewArticle(request, month, year):
text = "Displaying articles of : %s/%s"%(year, month)
return HttpResponse(text)
対応する url.py ファイルは次のようになります-
from django.conf.urls import patterns, include, url
urlpatterns = patterns('myapp.views',
url(r'^hello/', 'hello', name = 'hello'),
url(r'^morning/', 'morning', name = 'morning'),
url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
url(r'^articles/(\d{2})/(\d{4})', 'viewArticles', name = 'articles'),)
「/myapp/articles/12/2006/」に移動すると、「Displaying article of:2006/12」が表示されますが、パラメータを逆にすると同じ結果は得られません。
これを回避するために、URLパラメーターをビューパラメーターにリンクすることができます。 そのため、 url.py は次のようになります-
from django.conf.urls import patterns, include, url
urlpatterns = patterns('myapp.views',
url(r'^hello/', 'hello', name = 'hello'),
url(r'^morning/', 'morning', name = 'morning'),
url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
url(r'^articles/(?P\d{2})/(?P\d{4})', 'viewArticles', name = 'articles'),)