本章所有的重要代码都在图示后面
一、先解决一个小问题
在之前的项目Django_one当中,虽然已经有了很多url并且都能访问成功,但每当运行项目时,点开的页面是这样的:
其原因是,当你没有给Django配置任何url时,Django本身会给你返回“小火箭发射”页面;当配置url之后,Django就自动取消掉这个功能了,所以如果想要访问时不看见这个页面,我们可以给它配置一个空的url:
from django.http import HttpResponse
from django.urls import path
from book.views import book, author_detail
from music.views import music, music_detail, musician_detail
def index(request):
return HttpResponse("这是首页")
urlpatterns = [
path('', index),
path('book/', book),
path('book/author_detail/', author_detail),
path('music/', music),
path('music/<music_name>/', music_detail),
path('music/musician/', musician_detail),
]
运行结果:
二、什么是URL模块化
大家在云村听音乐的时候,往往会收藏很多歌单——电音的,纯音乐的,英文的,国语的。当你敲代码的时候,你就想听个电音抖腿歌单;当你心情郁闷的时候,你就想听个国语治愈歌单。如果伤心的时候,歌单里面突然播放一首重金属,你心里是不是五味杂陈?,本来心情就不大好,这下就更加糟糕了,所以将歌曲分类是一个好习惯。
咳咳,进入正题。同歌曲分类一样,Django项目中的URL也需要分类,我习惯叫做URL模块化。为了解释什么是URL模块化,我们先来看看Django_one项目里的URL:
urlpatterns = [
path('', index),
path('book/', book),
path('book/author_detail/', author_detail),
path('music/', music),
path('music/<music_name>/', music_detail),
path('music/musician/', musician_detail),
]
里面有首页类地址,有书籍类地址,有音乐类地址,以及他们的下级地址,作者详情,音乐家详情等等。在实际开发中,项目功能往往多达四五十个,大型项目甚至成百上千个,这时候如果把所有App的views.py
中的视图映射都放在urls.py
中映射,肯定会让代码写得非常杂乱。因此,Django为我们提供了一个方法,可以在App内部包含自己的URL匹配规则,而在项目的urls.py
中再统一包含这个App的urls.py
。要完成这个功能需要使用include
函数。
三、URL模块化实战
在此我们创建一个新项目Django_three,具体操作本系列第一章。
-
创建前台App-front和后台App-cms,具体代码看这本系列第二章。
-
在App-cms和front的视图模块
views.py
下均创建首页和登录两个视图函数:-
后台视图
cms/views.py
:from django.http import HttpResponse def index(request): return HttpResponse("后台首页") def login(request): return HttpResponse("后台登录页面")
-
前台视图
front/views.py
:from django.http import HttpResponse def index(request): return HttpResponse("后台首页") def login(request): return HttpResponse("后台登录页面")
-
-
URL模块化
在cms和front下面都创建一个urls.py
文件,将所有和cms和front这些app相关的都分别移动到各自的urls.py
文件中,然后在Django_three/urls.py
中,通过include
函数包含cms.urls
和front.urls
,以后在请求cms相关的URL的时候都需要添加一个book
前缀,front相关URL同理-
后台URL配置
cms\urls.py
:from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), path('login/', views.login, name='login'), ]
-
前台URL配置
front\urls.py
:from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), path('login/', views.login, name='login'), ]
-
整体URL配置
Django_three\urls.py
:from django.urls import path, include urlpatterns = [ path('', include('front.urls')), path('cms/', include('cms.urls')), ]
注意!!
url
是会根据主urls.py
和App中的urls.py
进行拼接的,因此注意不要多加斜杠。-
在终端运行项目
python manage.py runserver 1238
:
查看运行结果请输入以下网址进行验证:'前台首页': http://127.0.0.1:1238/ '前台登录页面': http://127.0.0.1:1238/login/ '后台首页': http://127.0.0.1:1238/cms/ '后台登录页面': http://127.0.0.1:1238/cms/login/
-
四、URL命名
-
什么是URL命名:
因为URL是经常变化的。在项目中,如果你在代码中将URL写死,有一天,客户或者项目经理说,/login/
这个URL我不喜欢,我要改成/signin/
。这样我们就需要改掉views.py
和urls.py
中的内容,如果要改的多的话,是相当麻烦的。给URL取个名字,以后使用URL的时候就使用他的名字进行反转就可以了,就不需要写死URL了。 -
如何给URL命名:在
path
函数中,传递一个参数name
就可以指定:-
后台URL配置
cms\urls.py
:from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), path('login/', views.login, name='login'), ]
-
前台URL配置
front\urls.py
:from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), path('login/', views.login, name='login'), ]
-
-
以后要修改URL只需要修改path的第一个参数就可以了。
五、重定向
我们打开知乎首页的时候会发现,如果我们之前没有登录,知乎就会自动给我们“跳转”到他的登录页面或者是注册页面。这里的“跳转”指的就是重定向。
在这里给我们的Django_three项目做一个设定:如果前台首页通过GET
方法获得username
参数,则直接访问前台首页,否则跳转到登录页面。
-
修改front的
views.py
的前台页面视图函数index
:from django.http import HttpResponse from django.shortcuts import redirect,reverse def index(request): # ?username=xx username = request.GET.get('username') # 如果获取到username,则直接访问前台页面 # 否则,重定向(跳转)到登录页面 if username: return HttpResponse("前台首页") else: return redirect('/login/') def login(request): return HttpResponse("前台登陆页面")
-
终端运行项目
python manage.py runserver 1238
查看运行结果请输入以下网址进行验证:# 带参数进行访问会直接跳到前台页面 '带参数username访问': http://127.0.0.1:1238/?username=KKChow # 不带参数进行访问,则会跳转到登录页面 '不带参访问': http://127.0.0.1:1238/
六、应用命名空间和反转
在Django_three项目中我们的前台front和后台cms都有同名的URL——index
和login
。这时候为了避免翻转URL时产生混淆,可使用应用命名空间,来做区分。
定义应用命名空间非常简单,只要在app
的urls.py
中定义一个变量app_name
,来指定这个应用的命名空间即可(cms.urls
同理):
- 前台URL配置
front\urls.py
:from django.urls import path from . import views # 应用命名空间 # 应用命名空间的变量叫做app_name app_name = 'front' urlpatterns = [ path('', views.index, name='index'), path('login/', views.login, name='login'), ]
- 后台URL配置
cms\urls.py
:from django.urls import path from . import views app_name = 'cms' urlpatterns = [ path('', views.index, name='index'), path('login/', views.login, name='login'), ]
定义了应用命名空间之后,我们将URL进行反转再进行重定向,Django进行URL反转的时候就不会产生混淆了:
from django.http import HttpResponse
from django.shortcuts import redirect,reverse
def index(request):
# ?username=xx
username = request.GET.get('username')
# 如果获取到username,则直接访问前台页面
# 否则,重定向(跳转)到登录页面
if username:
return HttpResponse("前台首页")
else:
# sign_in
login_url = reverse('front:login')
return redirect(login_url)
def login(request):
return HttpResponse("前台登陆页面")
七、总结
本章对Django对URL模块进行了详细解析,但个人感觉写的不是很好,可是想要改进却无从下手,希望各位大佬给点意见?。
Tips:如本章存在错误或者有更好的建议,欢迎大家在评论处发表意见,本萌新会做出相应的改进的! ???