[Python自学] day-21 ()

一、路由映射的参数

在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")

猜你喜欢

转载自www.cnblogs.com/leokale-zz/p/12070009.html
今日推荐