url模块化
-
如果所有的URL都放在主
urls.py
,则不好管理 -
可以让每个app管理自己对应的URL
-
在app包下新建一个文件(比如
urls.py
)来存储这些URL的映射 -
操作
-
在主
urls.py
中导入include
函数,用include
函数包含子urls.py
,参数是应用名.子urls文件名
#主urls.py from django.urls import path, include #导入include模块 urlpatterns = [ path('app/sub/', include("App.urls")), #App是应用名,urls是App下的urls.py ]
-
在app的
urls.py
中,所有的URL匹配也是放在urlpatterns
中# App下的urls/py from django.urls import path #记得导入 from . import views # 导入自己包下的视图函数 urlpatterns = [ path('list', views.url_sub), path('<param>', views.url_sub_param) ]
-
URL的具体地址是根据主
urls.py
和app中的子urls.py
进行拼接,因此不要多加斜杠- 比如上面就是
app/sub/
+list
或者+<param>
- 比如上面就是
-
命名空间
应用命名空间
- 在多个app之间,出现同名的URL,为了避免在reverse()的时候出现歧义,可以使用应用命名空间。
- 在app的
urls.py
中定义一个app_name
的变量,来指定这个应用的命名空间即可。 reverse(app_name:url_name)
来进行翻转。
实例命名空间
-
一个app可以产生多个实例,可以使用多个URL映射到同一个app,在做翻转的时候仅仅指定应用命名空间,可能会跳到其他实例的函数中。
-
接下来引用的知了课堂-Django的例子
# 主urls.py urlpatterns = [ path('cms1/', include("CMS.urls")), path('cms2/', include("CMS.urls")), ]
#CMS app 中的子urls.py from django.urls import path from . import views app_name = "CMS" #应用命名空间 urlpatterns = [ path('page1', views.Webpage1, name="p1"), #URL名 path('page2', views.Webpage2, name="p2"), #URL名 ]
from django.shortcuts import render,HttpResponse,redirect from django.urls import reverse def Webpage1(request): value = request.GET.get("name") if value: return HttpResponse("page1") else: current_space = request.resolver_match.namespace print(current_space) #如果没有设置实例命名空间,则namespace为空 return redirect(reverse("CMS:p2")) # CMS:p2 调用的都是作为应用命名空间的CMS def Webpage2(request): return HttpResponse("page2")
-
运行
- 浏览器键入
127.0.0.1:8000/cms1/page1
- 浏览器键入
127.0.0.1:8000/cms2/page1
- 会发现调用的都是实例
cms1
的webpage2
函数
- 浏览器键入
-
-
可以使用实例命名空间,在
include()
函数中传递一个namespace
变量即可,但是要注意,指定实例命名空间,必须向指定应用命名空间
下面只注释有改变的地方# 主urls.py urlpatterns = [ path('cms1/', include("CMS.urls", namespace="one")), #添加cms1的实例名为one path('cms2/', include("CMS.urls", namespace="two")), #添加cms2的实例名为two ]
#CMS app 中的子urls.py from django.urls import path from . import views app_name = "CMS" urlpatterns = [ path('page1', views.Webpage1, name="p1"), path('page2', views.Webpage2, name="p2"), ]
from django.shortcuts import render,HttpResponse,redirect from django.urls import reverse def Webpage1(request): value = request.GET.get("name") if value: return HttpResponse("page1") else: current_space = request.resolver_match.namespace #获得命名空间 print(current_space) return redirect(reverse("{}:p2".format(current_space)))#记住reverse的是URL的名字, 运行的时候都是就根据各自的namespace变成 one:p2或者two:p2 # return redirect(reverse("CMS:page2")) def Webpage2(request): return HttpResponse("page2")
- 默认的程序命名空间为空
#views.py def views_func(request): ... current_space = request.resolver_match.namespace print(current_space) ...
-
运行
- 浏览器键入
127.0.0.1:8000/cms1/page1
-
浏览器键入
127.0.0.1:8000/cms2/page1
-
此时跳转的都是各自实例的
webpage2
函数
- 浏览器键入