web-dev-qa-db-ja.com

URL名前空間の実際の例

Djangoドキュメンテーションを勉強していますが、理解できない部分に遭遇しました:実際の問題で名前空間を使用する方法の実際の例です。構文は知っていますが、これの目的がわからない。

30
Harold Finch

通常、各アプリケーションの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" %}_にあることに注意してください。

35
Mike DeSimone

以下のような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')

5
nikhil ponnuru

また、ミドルウェア内のネームスペースを使用して、特定のネームスペースを異なる方法で処理します

    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
0
darkrat