zoukankan      html  css  js  c++  java
  • 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' %}
    
  • 相关阅读:
    VysorPro助手
    Play 2D games on Pixel running Android Nougat (N7.1.2) with Daydream View VR headset
    Play 2D games on Nexus 6P running Android N7.1.1 with Daydream View VR headset
    Native SBS for Android
    ADB和Fastboot最新版的谷歌官方下载链接
    How do I install Daydream on my phone?
    Daydream Controller手柄数据的解析
    蓝牙BLE传输性能及延迟分析
    VR(虚拟现实)开发资源汇总
    Android(Java)控制GPIO的方法及耗时分析
  • 原文地址:https://www.cnblogs.com/17vv/p/11688453.html
Copyright © 2011-2022 走看看