django框架详解,django路由匹配原则

  django框架详解,django路由匹配原则

  本文介绍了Django框架中路由的使用,并通过示例代码进行了详细介绍。对大家的学习或者工作都有一定的参考价值,有需要的朋友可以参考一下。

  

简介

 

  简单来说,路由就是根据用户请求的URL链接判断对应的处理程序,并返回处理结果,即URL与Django的视图建立映射关系。

  Django路由是在urls.py中配置的,urls.py中的每个配置都对应相应的处理方法。

  Django urls.py的不同版本有不同的配置:

  

1、Django1.1.x 版本

 

  url() 方法:普通路径和常规路径都可以使用,所以需要手动添加常规的第一个限制符号。

  从django.conf.urls导入url #需要引入url

  urlpatterns=[

  url(r^admin/$,管理网站网址),

  Url (r index/$ ,views.index),#普通路径

  Url (r articles/([0-9] {4})/$ ,views.articles),#常规路径

  ]

  

2、Django 2.2.x 之后的版本

 

  路径:用于普通路径。不需要自己手动添加常规的第一个限制符号。已经添加了底层。Re_path:用于常规路径,需要手动添加常规的第一个限制符号。from django.urls导入re_path #需要用re_path引入。

  urlpatterns=[

  路径( admin/,admin.site.urls),

  Path(index/,views.index),#普通路径

  re _ path(r articles/([0-9]{ 4 })/$ ,views.articles),#常规路径

  ]

  总结:Django 1.1 . x版中的url与Django 2.2 . x版中的re_path相同

  

二、正则路径中的分组

 

  

1、正则路径中的无名分组

 

  未命名群按位置传输,一一对应。

  除了request,视图中其他参数的数量应该与URL中的组数一致。

  urls.py

  urlpatterns=[

  路径( admin/,admin.site.urls),

  re_path(^index/([0-9]{4})/$,观点指数),

  ]

  views.py

  从django.shortcuts导入HttpResponse

  定义索引(请求,年份):

  Print(year) #形参表示路径中一个包的内容,按顺序匹配。

  返回HttpResponse(菜鸟教程)

  

2、正则路径中的有名分组

 

  语法:

  (?p组名正则表达式)

  命名组按关键字传递,不考虑位置顺序。

  除了request,视图中其他参数的个数应该和URL中的组数相同,视图中参数的名称应该和URL中的组名相对应。

  urls.py

  urlpatterns=[

  路径( admin/,admin.site.urls),

  re_path(^index/(?P[0-9]{4})/(?P[0-9]{2})/$ ,views.index),

  ]

  views.py

  从django.shortcuts导入HttpResponse

  定义索引(请求,年,月):

  Print(year,month) #形参表示路径中一个包的内容,由关键字匹配。

  返回HttpResponse(菜鸟教程)

  

3、路由分发(include)

 

  存在问题:在Django项目中,多个app目录共享一个URL容易造成混乱,后期维护不方便。

  ng>解决:使用路由分发(include),让每个app目录都单独拥有自己的 urls。

  步骤:

  

  • 1、在每个 app 目录里都创建一个 urls.py 文件。

  • 2、在项目名称目录下的 urls 文件里,统一将路径分发给各个 app 目录。

 

  

from django.contrib import admin

 

  

 

  在各自 app 目录下,写自己的 urls.py 文件,进行路径跳转。

  app01 目录:

  

from django.urls import path,re_path

 

  app02 目录:

  

from django.urls import path,re_path

 

  

 

  

 

  在各自 app 目录下的 views.py 文件中写各自的视图函数。

  

三、反向解析

 

  随着功能的增加,路由层的 url 发生变化,就需要去更改对应的视图层和模板层的 url,非常麻烦,不便维护。

  这时我们可以利用反向解析,当路由层 url 发生改变,在视图层和模板层动态反向解析出更改后的 url,免去修改的操作。

  反向解析一般用在模板中的超链接及视图中的重定向。

  

1、普通路径

 

  在 urls.py 中给路由起别名,name="路由别名"

  

path("login1/", views.login, name="login")

 

  

 

  在 views.py 中,从 django.urls 中引入 reverse,利用reverse("路由别名")反向解析:

  

return redirect(reverse("login"))

 

  

 

  在模板 templates 中的 HTML 文件中,利用{% url "路由别名" %}反向解析。

  

<form action="{% url login %}" method="post">

 

  

 

  

2、正则路径(无名分组)

 

  在 urls.py 中给路由起别名,name="路由别名"

  

re_path(r"^login/([0-9]{2})/$", views.login, name="login")

 

  

 

  在 views.py 中,从 django.urls 中引入 reverse,利用reverse("路由别名",args=(符合正则匹配的参数,))反向解析。

  

return redirect(reverse("login",args=(10,)))

 

  

 

  在模板 templates 中的 HTML 文件中利用{% url "路由别名" 符合正则匹配的参数 %}反向解析。

  

<form action="{% url login 10 %}" method="post">

 

  

 

  

3、正则路径(有名分组)

 

  在 urls.py 中给路由起别名,name="路由别名"

  

re_path(r"^login/(?P<year>[0-9]{4})/$", views.login, name="login")

 

  

 

  在 views.py 中,从 django.urls 中引入 reverse,利用reverse("路由别名",kwargs={"分组名":符合正则匹配的参数})反向解析。

  

return redirect(reverse("login",kwargs={"year":3333}))

 

  

 

  在模板 templates 中的 HTML 文件中,利用{% url "路由别名" 分组名=符合正则匹配的参数 %}反向解析。

  

<form action="{% url login year=3333 %}" method="post">

 

  

 

  

四、命名空间

 

  命名空间(英语:Namespace)是表示标识符的可见范围。

  一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。

  一个新的命名空间中可定义任何标识符,它们不会与任何重复的标识符发生冲突,因为重复的定义都处于其它命名空间中。

  存在问题:路由别名 name 没有作用域,Django 在反向解析 URL 时,会在项目全局顺序搜索,当查找到第一个路由别名 name 指定 URL 时,立即返回。当在不同的 app 目录下的urls 中定义相同的路由别名 name 时,可能会导致 URL 反向解析错误。

  解决:使用命名空间。

  

普通路径

 

  定义命名空间(include 里面是一个元组)格式如下:

  

include(("app名称:urls","app名称"))

 

  实例:

  

path("app01/", include(("app01.urls","app01")))

 

  

 

  在 app01/urls.py 中起相同的路由别名。

  

path("login/", views.login, name="login")

 

  

 

  在 views.py 中使用名称空间,语法格式如下:

  

reverse("app名称:路由别名")

 

  实例:

  

return redirect(reverse("app01:login")

 

  

 

  在 templates 模板的 HTML 文件中使用名称空间,语法格式如下:

  

{% url "app名称:路由别名" %}

 

  实例:

  

<form action="{% url app01:login %}" method="post">

 

  

 

  到此这篇关于Django框架之路由用法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: