Django入门超easy系列(三)——— URL详解(一)

本章所有的重要代码都在图示后面

一、先解决一个小问题

在之前的项目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.urlsfront.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.pyurls.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参数,则直接访问前台首页,否则跳转到登录页面。

  1. 修改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("前台登陆页面")
    
  2. 终端运行项目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——indexlogin。这时候为了避免翻转URL时产生混淆,可使用应用命名空间,来做区分。

定义应用命名空间非常简单,只要在appurls.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:如本章存在错误或者有更好的建议,欢迎大家在评论处发表意见,本萌新会做出相应的改进的! ???

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值