路由的name和namespace(命名空间)
name
作用:给一个路由起个名字 + 根据名字反向生成URL。
urlpatterns = [
path('login/', views.login),
path('auth/', views.auth),
]
# 很多功能,很多URL
urlpatterns = [
path('login/', views.login, name="v1"),
path('auth/', views.auth, name="v2"),
]
反向生成
在视图函数中生成URL,进行跳转
from django.urls import reverse
url1 = reverse("v1") # /login/
url2 = reverse("v2") # /auth/
from django.shortcuts import redirect
return redirect("/login/") # 上下等同
return redirect(url1)
HTML模板,页面上有一个a标签,添加xx。
<a href="/xxx/xxx/xx/">添加</a>
<a href="{% url 'v1' %}">添加</a>
<a href="{% url 'v2' %}">添加</a>
正则路由反向生成:
有组名:
urlpatterns = [
path('login/<str:role>/', view.login, name="v1"),
re_path(r'xxxx/(?P<nid>\d+)/(?P<tpl>\w+)/', views.auth, name="v3"),
]
from django.urls import reverse
url1 = reverse("v1", kwargs={"role": "hhh"})
url3 = reverse("v3", kwargs={"nid": "666", "tpl": "ddd"})
<a href="{% url 'v1' role='hhh' %}"></a>
<a href="{% url 'v3' nid=666 tpl='ddd' %}"></a>
没有组名:
urlpatterns = [
re_path(r'auth/(\d+)/(\w+)/', views.auth, name="v2"),
]
from django.urls import reverse
url2 = reverse("v2", args=(666, "ppp"))
<a href="{% url 'v2' 666 'ppp' %}"></a>
namespace(命名空间)
作用 :辅助name。
主路由作路由分发
-
./urls.py
from django.urls import path, re_path, include # 很多功能,很多URL urlpatterns = [ path('api/', include("apps.api.urls",namespace='x1')), path('web/', include("apps.web.urls",namespace='x2')), ]
-
api/urls.py
from django.urls import path, re_path from . import views # 很多功能,很多URL urlpatterns = [ path('login/', views.login,name="login"), path('auth/', views.auth, name='auth'), ]
-
web/urls.py
from django.urls import path, re_path from . import views # 很多功能,很多URL urlpatterns = [ path('home/', views.home,name='home'), path('order/', views.order,name='order'), path('auth/', views.order, name='auth'), ]
反向生成:
from django.urls import reverse
url = reverse("x1:login") # /api/login/
url = reverse("x2:order") # /web/order/
url = reverse("x1:auth") # /api/auth/
url = reverse("x2:auth") # /web/auth/
app_name
-
namespace需要设置app_name(高版本)
urlpatterns = [ path('api/', include("apps.api.urls", namespace='x1')), ]
from django.urls import path from apps.api import views # 很多功能,很多URL urlpatterns = [ path('login/', views.login, name="login"), path('auth/', views.auth, name='auth'), ] app_name = "api"
多层分发
手动分发
urlpatterns = [
path('api/', ([
path('login/', views.login, name="login"),
path('user/', views.user, name='user'),
], "api", "api")),
]
多层分发
urlpatterns=[
path('api/',([
path('login/,'view.login,name="login"),
path('user/,'([
path('list/',view.list,name=list)
],'user','user')),
],'api','api'))
]
# /api/user/list/ ==> x1:yy:xx
获取当前匹配对象的name和namespace
可以获取当前要访问的url_name、app_name、namespace
request.resolver_match
返回值
ResolverMatch(func=web.views.account.login, args=(), kwargs={}, url_name=login, app_names=[], namespaces=[], route=login/)