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 相关文章推荐
python清除字符串里非数字字符的方法
Jul 02 Python
python类和继承用法实例
Jul 07 Python
python3音乐播放器简单实现代码
Apr 20 Python
Python使用正则表达式实现文本替换的方法
Apr 18 Python
python实现微信每日一句自动发送给喜欢的人
Apr 29 Python
对pyqt5多线程正确的开启姿势详解
Jun 14 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
Sep 26 Python
python函数不定长参数使用方法解析
Dec 14 Python
基于nexus3配置Python仓库过程详解
Jun 15 Python
简单的Python人脸识别系统
Jul 14 Python
Python自动发送和收取邮件的方法
Aug 12 Python
详解运行Python的神器Jupyter Notebook
Jun 03 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版(1)
2006/10/09 PHP
需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
2008/05/26 PHP
PHP对MongoDB[NoSQL]数据库的操作
2013/03/01 PHP
探讨如何把session存入数据库
2013/06/07 PHP
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
Yii rules常用规则示例
2016/03/15 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
2016/06/13 PHP
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
JavaScript 类似flash效果的立体图片浏览器
2010/02/08 Javascript
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
2010/08/16 Javascript
javascript函数以及基础写法100多条实用整理
2013/01/13 Javascript
基于OO的动画附加插件,可以实现弹跳、渐隐等动画效果 分享
2013/06/24 Javascript
带左右箭头图片轮播的JS代码
2013/12/18 Javascript
实现React单页应用的方法详解
2016/08/02 Javascript
javascript 中的事件委托详解
2016/10/25 Javascript
node+express+ejs使用模版引擎做的一个示例demo
2017/09/18 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
基于webpack 实用配置方法总结
2017/09/28 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
2018/03/22 Javascript
微信小程序input框中加入小图标的实现方法
2018/06/19 Javascript
详解基于 Node.js 的轻量级云函数功能实现
2019/07/08 Javascript
vue项目中自定义video视频控制条的实现代码
2020/04/26 Javascript
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
Python实现监控程序执行时间并将其写入日志的方法
2015/06/30 Python
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
2016/07/04 Python
Selenium定时刷新网页的实现代码
2018/10/31 Python
python函数的万能参数传参详解
2019/07/26 Python
在python3中实现更新界面
2020/02/21 Python
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
2013/08/02 HTML / CSS
大学生村官事迹材料
2014/01/21 职场文书
母亲节感恩寄语
2014/02/21 职场文书
商业街策划方案
2014/05/31 职场文书
2014年政风行风工作总结
2014/11/22 职场文书
职位证明模板
2015/06/23 职场文书
快消品行业营销模式与盈利模式分享
2019/09/27 职场文书
2019年新郎保证书3篇
2019/10/17 职场文书