Django框架之路由用法


Posted in Python onJune 10, 2022

简介

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

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

Django 不同版本 urls.py 配置有点不一样:

1、Django1.1.x 版本

url() 方法:普通路径和正则路径均可使用,需要自己手动添加正则首位限制符号。

from django.conf.urls import url # 用 url 需要引入
urlpatterns = [
    url(r'^admin/$', admin.site.urls),
    url(r'^index/$', views.index), # 普通路径
    url(r'^articles/([0-9]{4})/$', views.articles), # 正则路径
]

2、Django 2.2.x 之后的版本

  • path:用于普通路径,不需要自己手动添加正则首位限制符号,底层已经添加。
  • re_path:用于正则路径,需要自己手动添加正则首位限制符号。
from django.urls import re_path # 用re_path 需要引入
urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index), # 普通路径
    re_path(r'^articles/([0-9]{4})/$', views.articles), # 正则路径
]

总结:Django1.1.x 版本中的 url 和 Django 2.2.x 版本中的 re_path 用法相同。

二、正则路径中的分组

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

无名分组按位置传参,一一对应。

views 中除了 request,其他形参的数量要与 urls 中的分组数量一致。

urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path("^index/([0-9]{4})/$", views.index),
]

views.py

from django.shortcuts import HttpResponse
def index(request,year):
print(year) # 一个形参代表路径中一个分组的内容,按顺序匹配
return HttpResponse('菜鸟教程')

Django框架之路由用法

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

语法:

(?P<组名>正则表达式)

有名分组按关键字传参,与位置顺序无关。

views 中除了 request,其他形参的数量要与 urls 中的分组数量一致, 并且 views 中的形参名称要与 urls 中的组名对应。

urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path("^index/(?P[0-9]{4})/(?P[0-9]{2})/$", views.index),
]

views.py

from django.shortcuts import HttpResponse
def index(request, year, month):
print(year,month) # 一个形参代表路径中一个分组的内容,按关键字对应匹配
return HttpResponse('菜鸟教程')

Django框架之路由用法

3、路由分发(include)

存在问题:Django 项目里多个app目录共用一个 urls 容易造成混淆,后期维护也不方便。

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

步骤:

  • 1、在每个 app 目录里都创建一个 urls.py 文件。
  • 2、在项目名称目录下的 urls 文件里,统一将路径分发给各个 app 目录。
from django.contrib import admin
from django.urls import path,include # 从 django.urls 引入 include
urlpatterns = [
    path('admin/', admin.site.urls),
    path("app01/", include("app01.urls")),
    path("app02/", include("app02.urls")),
]

Django框架之路由用法

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

app01 目录:

from django.urls import path,re_path 
from app01 import views # 从自己的 app 目录引入 views 
urlpatterns = [ 
    re_path(r'^login/(?P<m>[0-9]{2})/$', views.index, ),
]

app02 目录:

from django.urls import path,re_path
from app02 import views # 从自己的 app 目录引入views 
urlpatterns = [ 
    re_path("^xxx/(?P[0-9]{4})/$", views.xxx), 
]

Django框架之路由用法

Django框架之路由用法

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

三、反向解析

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

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

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

1、普通路径

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

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

Django框架之路由用法

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

return redirect(reverse("login"))

Django框架之路由用法

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

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

Django框架之路由用法

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

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

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

Django框架之路由用法

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

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

Django框架之路由用法

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

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

Django框架之路由用法

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

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

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

Django框架之路由用法

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

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

Django框架之路由用法

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

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

Django框架之路由用法

四、命名空间

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

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

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

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

解决:使用命名空间。

普通路径

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

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

实例:

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

Django框架之路由用法

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

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

Django框架之路由用法

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

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

实例:

return redirect(reverse("app01:login")

Django框架之路由用法

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

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

实例:

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

Django框架之路由用法

到此这篇关于Django框架之路由用法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。


Tags in this post...

Python 相关文章推荐
简单的通用表达式求10乘阶示例
Mar 03 Python
python从sqlite读取并显示数据的方法
May 08 Python
Python常见异常分类与处理方法
Jun 04 Python
对Python中DataFrame选择某列值为XX的行实例详解
Jan 29 Python
Python常用特殊方法实例总结
Mar 22 Python
Python完成毫秒级抢淘宝大单功能
Jun 06 Python
浅谈Python中(&amp;,|)和(and,or)之间的区别
Aug 07 Python
详解Python3 中的字符串格式化语法
Jan 15 Python
解决pytorch-yolov3 train 报错的问题
Feb 18 Python
使用Python爬取弹出窗口信息的实例
Mar 14 Python
python 实现分组求和与分组累加求和代码
May 18 Python
教你怎么用python实现字符串转日期
May 24 Python
深入理解pytorch库的dockerfile
Jun 10 #Python
如何利用python实现列表嵌套字典取值
Jun 10 #Python
python中filter,map,reduce的作用
Jun 10 #Python
Django框架中模型的用法
Jun 10 #Python
Django框架中视图的用法
Jun 10 #Python
python基础之//、/与%的区别详解
Jun 10 #Python
Django框架中表单的用法
Jun 10 #Python
You might like
PHP 巧用数组降低程序的时间复杂度
2010/01/01 PHP
php 高效率写法 推荐
2010/02/21 PHP
php iconv() : Detected an illegal character in input string
2010/12/05 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
PHP中extract()函数的妙用分析
2012/07/11 PHP
彻底删除thinkphp3.1案例blog标签的方法
2014/12/05 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
JS是否可以跨文件同时控制多个iframe页面的应用技巧
2007/12/16 Javascript
jquery+json实现的搜索加分页效果
2010/03/31 Javascript
地址栏传递中文参数乱码在js里用escape转码
2013/08/28 Javascript
JQuery处理json与ajax返回JSON实例代码
2014/01/03 Javascript
js动态控制table的tr、td增加及删除的具体实现
2014/04/30 Javascript
jquery实现表单验证并阻止非法提交
2015/07/09 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
js调用webservice构造SOAP进行身份验证
2016/04/27 Javascript
AngularJS入门教程之ng-class 指令用法
2016/08/01 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
2017/04/01 Javascript
react-native中ListView组件点击跳转的方法示例
2017/09/30 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
2018/10/25 Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
2019/05/28 Javascript
python安装教程 Pycharm安装详细教程
2017/05/02 Python
Python的mysql数据库的更新如何实现
2017/07/31 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
python3解析库BeautifulSoup4的安装配置与基本用法
2018/06/26 Python
Django重置migrations文件的方法步骤
2019/05/01 Python
django框架基于模板 生成 excel(xls) 文件操作示例
2019/06/19 Python
python中时间转换datetime和pd.to_datetime详析
2019/08/11 Python
python单向循环链表原理与实现方法示例
2019/12/03 Python
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
采购部岗位职责
2013/11/24 职场文书
工厂门卫岗位职责
2013/11/25 职场文书
带薪年假请假条
2014/02/04 职场文书
出纳担保书范文
2014/04/02 职场文书
地下停车场租赁协议范本
2014/10/07 职场文书
《成长的天空》读后感3篇
2019/12/06 职场文书