• Django基础之路由分发


    Django之路由层

    一、路由的作用

    ​ 路由其实就是请求地址与视图函数的映射关系,如果把网站比喻为一本书,那么路由就好比是这本书的目录,在Django中路由默认配置在urls.py中。

    二、简单的路由配置

    # urls.py
    from django.conf.urls import url
    
    # urlpatterns(路由表):由一条条映射关系组成
    urlpatterns = [
        url(regex, view, kwargs=None, name=None),  # ulr本质是一个函数
    ]
    
    # regex: 正则表达式,用来匹配url地址的路径部分 例如:http://127.0.0.1:8000/index/匹配的部# 分为 index/
    # view: 通常为一个视图函数,用来处理业务逻辑
    # kwargs: 略(用法详见有名分组)
    # name: 略(用法详见反向解析)
    

    注意:

    ​ 在配置文件settings.py中有一个参数APPEND_SLASH,该参数有两个值True或False。当APPEND_SLASH=True(如果配置文件中没有该配置, APPEND_SLASH的默认值为True),并且用户请求的url地址的路径部分不是以/结尾。那么当这个url匹配不到的时候,Django会在路径后面加上/再去路由表中匹配。

    三、分组

    ​ 分组主要是为了让后台获取url中的参数。Django中有两种分组方式,分别为:无名分组与有名分组。

    3.1 无名分组

    # urls.py
    from django.conf.urls import url
    
    urlpatterns = [
        # 下述正则表达式会匹配url地址的路径部分为:index/数字/,匹配成功的分组部分会以位置参数的形式传给视图函数,有几个分组就传几个位置参数(小括号内为参数的值)
        url(r'^index/(d+)/$', views.index),
    ]
    

    3.2 有名分组

    # urls.py
    from django.conf.urls import url
    
    urlpatterns = [
        # 该正则会匹配url地址的路径部分为:article/数字/,匹配成功的分组部分会以关键字参数(article_id=匹配成功的数字)的形式传给视图函数,有几个又名分组就会传几个关键字参数
        url(r'^index/(?P<index_id>d+)$', views.index),
    ]
    

    总结:

    ​ 有名分组和无名分组都是为了获取路径中的参数,并传递给视图函数,区别在于无名分是以位置参数的形式传递,有名分组是以关键字参数的形式传递。

    注意:无名分组和有名分组不要混合使用!!!!!!

    四、路由分发

    ​ 随着Django项目功能的增加,app会越来越多,路由也越来越多,每个app都会有属于自己的路由,如果再将所有的路由都放到一张表路由中,会导致结构不清晰,不便于管理,所以我们应该将app自己的路由交由自己管理,然后在总路由表中做分发,具体做法如下

    1 创建两个app

    # 打开pycharm的Terminal
    # 创建app01和app02
    python manage.py startapp app01
    python manage.py startapp app02
    

    2 在每个app下手动创建urls.py来存放自己的路由,如下:

    # app01下的urls.py
    from django conf.urls import url
    from app01 import views
    
    urlpatterns = [
        url(r'^index/$', views.index),
    ]
    
    # app02下的urls.py
    from django conf.urls import url
    from app02 import views
    
    urlpatterns = [
        url(r'^index/$', views.index),
    ]
    

    3 总urls.py文件中(项目文件下的urls.py)

    # urls.py
    from django.conf.urls import url, include
    from django.contrib import admin
    
    # 总路由表
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        
        # 新增两条路由,注意不能以$结尾
        url(r'^app01/', include('app01.urls')),
        url(r'^app02/', include('app02.urls')),
    ]
    
    # include函数就是做分发操作的,当在浏览器输入http://127.0.0.1:8000/app01/index/时,会先进入到总路由表中进行匹配,正则表达式r'^app01/'会先匹配成功路径app01/,然后include功能会去app01下的urls.py中继续匹配剩余的路径部分
    

    五、反向解析

    ​ 在软件开发初期,url地址的路径设计可能并不完美,后期需要进行调整,如果项目中很多地方使用了该路径,一旦该路径发生变化,就意味着所有使用该路径的地方都需要进行修改,这是一个非常繁琐的操作。

    ​ 解决方案就是在编写一条url时,通过参数name为url地址的路径部分起一个别名,项目中就可以通过别名来获取这个路径。以后无论路径如何变化别名和路径始终保持一致。

    上述方案中通过别名获取路径的过程称为反向解析。

    定义别名:

    # urls.py
    # app01下的urls.py
    from django conf.urls import url
    from app01 import views
    
    urlpatterns = [
        url(r'^login/$', views.login, name='login'),
    ]
    

    使用别名:

    在views.py中,反向解析的使用:

    # views.py
    from django.shortcuts import reverse, redirect
    
    def login(reuqest):
        ulr = reverse('login')  # reverse会将别名'login'反向解析为/login/
        return redirect(url)
    

    在模板login.html文件中,反向解析的使用:

    {% url 'login' %}
    
  • 相关阅读:
    1.20
    1.18
    4.16python安装
    4.15Android学习
    4.14Android学习
    4.13Android学习
    4.12Android学习
    4.11Android学习
    4.10Android学习
    4.09Android学习
  • 原文地址:https://www.cnblogs.com/17vv/p/11688453.html
Copyright © 2020-2023  润新知