django不同版本的路由配置

  django 2之前,配置urlpatterns使用的是url方法

  django 2之后,配置urlpatterns使用的是path方法

  

  path与url的区别:

    url()的第一个参数(即需要匹配的路径字符串),能够使用正则表达式

    path()的第一个参数,不能够使用正则表达式

  但是,django 2之后提供了一种支持正则表达式的路径匹配方法:re_path

  re_path的使用方法和url一样

路由配置

  基本格式:

    url(正则表达式,views视图,参数,别名 )

    re_path(正则表达式,views视图,参数,别名 )

      path(路径字符串,views视图,参数,别名 )

  使用正则表达式进行路径匹配时,需要注意:

    1、所写的正则表达式必须能够准确匹配到相应的路径

    2、尤其要注意^和$的使用

        如果需要匹配到路径index,即127.0.0.1:8000/index

          正则表达式应该为:^index$

          而不能是:^index/$,这个表达式匹配到的路径是index/

        其次如果不写^和$也容易出错

          这样的话,只要路径中包含index子串就会被匹配到,导致真正处理该路径的视图函数无法被调用到

          这是因为路由匹配的顺序是从urlpatterns列表的第一个元素到最后一个元素,只要匹配过程中能够匹配成功,就不再继续往后匹配了,那么这个正则表达式就会导致上述问题的发送。

分组匹配和分组命名匹配(使用正则匹配)

  静态路由:只能匹配到指定url

  动态路由:能够匹配到多个符合正则要求的url

  分组匹配:

    形如:url(r'^index/([0-9]{4})/$', views.index)

    将分组得到的值以位置参数的形式传给对应的视图函数,该视图函数需要提前定义好接受该参数的形参(否则会报错)

  分组命名匹配:

    形如:re_path(r'^index/(?P<num>[0-9]{4})/$'

    将分组得到的值以关键字参数的形式传给对应的视图函数,其中键名就是num,键值就是匹配到的值。同样需要视图函数提前定义好接受该参数的形参

  注意:

    1、分组匹配和分组命名匹配不能同时用于匹配一个url,因为此时只有分组命名匹配有效

    2、使用分组命名匹配后,url/path/re_path的第三个参数(是一个字典)的键名不能和分组命名的一样,如果一样的话,分组命名匹配到的值会被该参数字典相应的值覆盖后传给视图函数

      url(正则表达式,views视图,参数,别名 )

      该参数的作用就是就是以关键字参数的形式将键值传给视图函数

    3、路由匹配到的分组参数都是字符串

  补充:

    django视图中的CBV,在配置路径时需要将CBV通过调用as_view方法转成FBV。其中as_view源码上有一段:

      self.setup(request, *args, **kwargs)
      def setup(self, request, *args, **kwargs):
      """Initialize attributes shared by all view methods."""
      self.request = request
      self.args = args
      self.kwargs = kwargs

    setup的作用就是将request对象以及路由匹配过程中捕获到的位置参数或者关键字参数一同绑定给实例化的CBV对象,以便CBV内部的方法能够使用到它们。

include路由分发

  当项目越做越大时,如果将所有的路由匹配都放在项目同名的目录下的urls文件中,将会造成可读性差,耦合性高。

  最好的方式就是各个app管理自己的路由,此时就需要用到include来做路由分发

    形如:path('app01/', include('app01.urls'))

    将匹配到前缀为app01的路径,交给app01.urls来进一步匹配

    此时若app01.urls中有这么一个path:

      path('index/', views.index)    那么它匹配到的路径就是    app01/index/

URL的命名与反向解析

  在开发过程中,有时候需要对路由匹配的路径做修改,这样就会导致前端页面上的超链接地址也要跟着修改,视图函数中相应的重定向地址也不例外。

  为了简化该过程,可以使用URL命名与反向解析:

    URL的命名:path('index', views.Cbv.as_view(), name='abc')

      然后就可以通过abc获取到对应的路径index

    反向解析:

      1、模板文件中,<a href="{% url 'abc' %}"> {% url 'abc' %}</a>

        通过{% url 'url对应的名称' %}就能够获取到相应的路径,即/index

        往后要是将该index修改成其他路径,也无需修改模板文件中对应的超链接地址

      2、视图函数中

          需要先导入from django.urls import reverse

          然后使用reverse("abc")就能够获取到abc对应的路径了

  以上操作只是针对静态路由,对于动态路由还分为:

    无名分组:

      URL的命名:re_path(r'^index/([0-9]{4})$', views.Cbv.as_view(), name='abc')

      反向解析:

        1、模板文件中

            <a href="{% url 'abc' '2020' %}"> {% url 'abc' '2020'%}</a>

            需要带上相应的位置参数,否则报错

        2、视图函数中

            reverse("abc", args=("2020",))

            也需要加上相应的位置参数

    有名分组:

      URL的命名:re_path(r'^index/(?P<num>[0-9]{4})$', views.Cbv.as_view(), name='abc')

      反向解析:

        1、模板文件中

            a、<a href="{% url 'abc' '2020' %}"> {% url 'abc' '2020'%}</a>

              可以用位置参数的形式,不过位置参数的顺序必须和分组名称顺序一致

            b、{% url 'abc' num='2020' %}

              还可以直接用关键字赋值的形式

        2、视图函数中

            a、reverse("abc", args=("2020",))

            b、reverse("abc", kwargs={"num": "2020"})

namespace

  和他人协作开发过程中,不同的app中可出现同名的路径、view函数以及URL的命名

  如:  

     app01:path("index", views.index, name="abc")

    app02:path("index", views.index, name="abc")

  此时,反向解析就会出错

  因为通过反向解析获取相应的路径时,django会将整个urlpatterns列表都扫描一遍,并不会因为中途匹配到某个路径后停止扫描,那么就会造成同名的url获取出来的路径是最后一个匹配到的路径,导致错误。

  这点与路由匹配过程不同,路由匹配是只要匹配到就停止对urlpatterns的扫描

  解决方式:

    在路由分发的时候,加上namespace属性,然后在方向解析时,使用namespace标注某个url所在的有效区域

      path('app01/', include('app01.urls',namespace='app01'))

    反向解析

      1、模板文件中

          {% url 'app01:abc'  %}

      2、视图函数中

          reverse("app01:abc")

  补充:

    redirect的to参数,可以直接填写url的名称(不通过reverse解析),也能够重定向到对应的路径

django—路由相关的更多相关文章

  1. Django路由控制总览

    今日内容:(路由层) 1 简单配置 -第一个参数是正则表达式(如果要精准匹配:'^publish/$') -第二个参数是视图函数(不要加括号) -url(r'^admin/', admin.site. ...

  2. Django路由配置

    Django路由配置系统.视图函数 1.路由配置系统(URLconf) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是 ...

  3. 关于Django路由层简单笔记

    Django—路由层 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来的某个U ...

  4. Django路由层与视图层

    表与表之间建关系 图书管理系统为例 书籍表 出版社表 作者表 三个表之间的关系: 考虑表之间的关系:换位思考 1.书籍和出版社是一对多,外键字段建立在书籍表中 2.书籍和作者是多对多, 需要建立第三方 ...

  5. Django路由系统

    django路由系统 简而言之,django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系.使请求到来之后,根据urls.py里的关系条目,去查找到与请求对应的处理方法,从 ...

  6. Django 路由系统

    Django 路由系统 基本格式 from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] 参数说 ...

  7. Django 模板相关

    Django 模板相关 视图函数只是直接返回文本,而在实际生产环境中其实很少这样用,因为实际的页面大多是带有样式的HTML代码,这可以让浏览器渲染出非常漂亮的页面.目前市面上有非常多的模板系统,其中最 ...

  8. Python菜鸟之路:Django 路由、模板、Model(ORM)

    Django路由系统 Django的路由系统让Django可以根据URI进行匹配,进而发送至特定的函数去处理用户请求.有点类似nginx的location功能. Django的路由关系分为三种:普通关 ...

  9. Python学习---Django路由系统【all】

    Django URL (路由系统) Django URL (路由系统): URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映 ...

随机推荐

  1. Linux系统编程—进程间同步

    我们知道,线程间同步有多种方式,比如:信号量.互斥量.读写锁,等等.那进程间如何实现同步呢?本文介绍两种方式:互斥量和文件锁. 互斥量mutex 我们已经知道了互斥量可以用于在线程间同步,但实际上,互 ...

  2. 《Head First 设计模式》:状态模式

    正文 一.定义 状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类. 要点: 状态模式允许一个对象基于内部状态而拥有不同的行为. 状态模式将状态封装成为独立的类,并将动作委托到代 ...

  3. 【性能优化】面试官:Java中的对象都是在堆上分配的吗?

    写在前面 从开始学习Java的时候,我们就接触了这样一种观点:Java中的对象是在堆上创建的,对象的引用是放在栈里的,那这个观点就真的是正确的吗?如果是正确的,那么,面试官为啥会问:"Jav ...

  4. Java基础一篇过(八)常见异常速查

    一.引言 开发过程中可能会遇到各种各样的异常,这里还是汇总一些比较典型的异常,有些比较直观的异常如空指针这种就不写了,此文可作为异常速查用. 二.异常大军正在来袭~ IllegalArgumentEx ...

  5. Oracle学习(十二)标量函数

    UCASE()大写转换  LCASE()小写转换 --把查询结果对应的列进行大写转换 SELECT UCASE(列) FROM 表; --把查询结果对应的列进行小写转换 SELECT LCASE(列) ...

  6. jpa基本常识

    1.hibernate更新表结构配置 jpa hibernate框架配置 spring.jpa.properties.hibernate.hbm2ddl.auto = create-drop 其意思是 ...

  7. Vue 组件的基础介绍

    1.组件定义 1.定义组件并引用 2.父组件向子组件传值 3.子组件向父组件传值 # 组件间传值:vuex (https://www.cnblogs.com/xiaonq/p/9697921.html ...

  8. pytorch和tensorflow的爱恨情仇之参数初始化

    pytorch和tensorflow的爱恨情仇之基本数据类型 pytorch和tensorflow的爱恨情仇之张量 pytorch和tensorflow的爱恨情仇之定义可训练的参数 pytorch版本 ...

  9. interp1一维数据插值在matlab中的用法

    转载:https://ww2.mathworks.cn/help/matlab/ref/interp1.html?s_tid=srchtitle#btwp6lt-2_1 interp1 一维数据插值( ...

  10. 【学习笔记】Polya定理

    笔者经多番周折终于看懂了\(\text{Burnside}\)定理和\(\text{Polya}\)定理,特来写一篇学习笔记来记录一下. 群定义 定义:群\((G,·)\)是一个集合与一个运算·所定义 ...