Djangoドキュメンテーションを勉強していますが、理解できない部分に遭遇しました:実際の問題で名前空間を使用する方法の実際の例です。構文は知っていますが、これの目的がわからない。
通常、各アプリケーションのURLを独自のネームスペースに配置するために使用されます。これにより、別のアプリでURLパターン名が一致したため、reverse()
Django関数と_{% url %}
_テンプレート関数が誤ったURLを返すのを防ぎます。
プロジェクトレベルの_urls.py
_ファイルには次のものがあります。
_from Django.conf.urls.defaults import *
from Django.conf import settings
from Django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^$', 'main.views.main', name='main'),
url(r'^login$', 'Django.contrib.auth.views.login', name="login"),
url(r'^logout$', 'Django.contrib.auth.views.logout',
{"next_page": "/"}, name="logout"),
# Admin
url(r'^admin/doc/', include('Django.contrib.admindocs.urls')),
url(r'^admin/', include(admin.site.urls)),
)
# Auto-add the applications.
for app in settings.LOCAL_APPS:
urlpatterns += patterns('',
url(r'^{0}/'.format(app), include(app + '.urls', namespace=app)),
)
_
最後のセクションに注意してください:これは私がインストールしたアプリケーションを通過します(_settings.LOCAL_APPS
_は自分のアプリのみを含む設定です; Southのような他のものを持つ_INSTALLED_APPS
_に追加されます)それらのそれぞれに_urls.py
_があり、それらのURLをアプリにちなんで命名された名前空間にインポートし、それらのURLをアプリにちなんで命名されたURLサブディレクトリに配置します。
そのため、たとえば、hosts
という名前のアプリがある場合、_hosts/urls.py
_は次のようになります。
_from Django.conf.urls.defaults import *
urlpatterns = patterns('hosts.views',
url(r'^$', 'show_hosts', name='list'),
)
_
これで、私の_views.py
_はreverse("hosts:list")
を呼び出して_hosts.views.show_hosts
_を呼び出すページへのURLを取得でき、_"/hosts/"
_のようになります。テンプレート内の_{% url "hosts:list" %}
_についても同様です。これにより、別のアプリで「リスト」という名前のURLと衝突することを心配する必要がなくなり、すべての名前の前に_hosts_
_を付ける必要がなくなります。
ログインページには名前空間が与えられていないため、_{% url "login" %}
_にあることに注意してください。
以下のようなURLパターンを使用していると考えてくださいurl(r'^login/',include('app_name', name='login'))
また、Django-RestFrameworkなどのサードパーティアプリを使用していることを考慮してください。アプリを使用するときは、プロジェクトのURL confファイルで次の行を宣言する必要があります。
_url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
_
これで、rest-frameworkのコードを確認すると、urls.pyファイルに次のコードがあります。
_urlpatterns = [
url(r'^login/$', login, login_kwargs, name='login'),
url(r'^logout/$', logout, name='logout'),
]
_
プロジェクトのURLパターンには「ログイン」名を使用しましたが、Django-rest-frameworkはURLパターンの1つに同じ名前を使用しています。 reverse( 'login')を使用すると、Djangoは混乱します。
これらの種類の問題を解決するために、ネームスペースを使用します。
_@register.simple_tag
def optional_docs_login(request):
"""
Include a login snippet if REST framework's login view is in the URLconf.
"""
try:
login_url = reverse('rest_framework:login')
except NoReverseMatch:
return 'log in'
_
名前空間のURL名が他の名前空間と衝突することはありません。
名前空間付きURLパターンは、次を使用して元に戻すことができますreverse('namespace:url_name')
また、ミドルウェア内のネームスペースを使用して、特定のネームスペースを異なる方法で処理します
def process_response(self, request, response):
try:
if resolve(request.path).namespace == 'special_namespace':
response['Custom-Header'] = 'Custom-Value'
return response
except Resolver404:
return response