一、路由映射的参数
在app/urls.py中,我们定义URL与视图函数之间的映射:
from django.contrib import admin from django.urls import path from django.urls import re_path from mgmt import views urlpatterns = [ path('index', views.index), path('host/', views.host), re_path('test_ajax$', views.test_ajax), ]
我们查看一下path()和re_path()的源码,可以看到参数信息:
def _path(route, view, kwargs=None, name=None, Pattern=None): pass
除了route表示url字符串,view表示视图函数的引用,name表示别名(可以在页面中用{% url name %}取url值)。
另外还有一个kwargs,这个参数是一个字典,用来传递参数给视图函数:
from django.contrib import admin from django.urls import path from django.urls import re_path from mgmt import views urlpatterns = [ path('index', views.index), path('host/', views.host), re_path('test_ajax$', views.test_ajax), path('test', views.test, {'name': 'root'}), ]
在视图函数的实现中,可以接受参数name:
# test视图函数,接受参数name def test(request, name): print(name) return HttpResponse("OK")
二、路由系统中的命名空间
(暂不清楚有什么用,感觉就是第一层urls.py映射的name参数,然后和App urls.py中的映射的name参数一起来反射URL)
当我们没有使用路由分发的时候,访问/index页面,直接使用http://127.0.0.0:8000/index就可以访问。
如果我们为其映射传入一个name参数:(参考:[Python自学] day-19 (1) (Django框架) 第六节)
path('test', views.test, {'name': 'root'}, name='tt')
我们在视图函数中,可以使用reverse来利用name获取URL:
# test视图函数,接受参数name def test(request, name): # 通过name='tt'来获取URL 'test' from django.urls import reverse url = reverse('tt') print(name) return HttpResponse("OK")
当我们使用了路由分发,urls.py分为两层。
第一层是Django工程目录下的urls.py:
from django.contrib import admin from django.urls import path from django.urls import include urlpatterns = [ path('cmdb/', include("cmdb.urls")), path('mgmt/', include("mgmt.urls")), ]
第二层才是App的urls.py(这里以mgmt为例):
from django.contrib import admin from django.urls import path from django.urls import re_path from mgmt import views urlpatterns = [ path('index', views.index), path('host/', views.host), re_path('test_ajax$', views.test_ajax), path('test', views.test, {'name': 'root'}, name='tt'), ]
假设,第一层urls.py变为这样:
from django.contrib import admin from django.urls import path from django.urls import include urlpatterns = [ # path('cmdb/', include("cmdb.urls")), path('mgmt/', include("mgmt.urls")), path('mgmt2/', include("mgmt.urls")), ]
这里的mgmt/ 和mgmt2/都指向mgmt App的urls.py。这就会导致我们用http://127.0.0.0:8000/mtmg/test和http://127.0.0.0:8000/mtmg2/test访问到的视图函数是同一个。
在这种情况下,如果我们想要在视图函数中分别获取两个不同的url,例如mgmt/test和mgmt2/test。可以为每个第一层映射添加一个命名空间:
from django.contrib import admin from django.urls import path from django.urls import include urlpatterns = [ # path('cmdb/', include("cmdb.urls")), path('mgmt/', include("mgmt.urls"), namespace='m1'), path('mgmt2/', include("mgmt.urls"), namespace='m2'), ]
使用命名空间的情况下,App urls.py还需要添加一个app_name变量:
from django.contrib import admin from django.urls import path from django.urls import re_path from mgmt import views app_name = 'mgmt' urlpatterns = [ path('index', views.index), path('host/', views.host), re_path('test_ajax$', views.test_ajax), path('test', views.test, {'name': 'root'}, name='tt'), ]
然后,我们在视图函数中使用reverse来获取URL:
# test视图函数,接受参数name def test(request, name): from django.urls import reverse # 通过'namespace:name',来获取url url = reverse('m1:tt') url2 = reverse('m2:tt') print(url) print(url2) return HttpResponse("OK")