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 相关文章推荐
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
Jan 22 Python
python操作mongodb根据_id查询数据的实现方法
May 20 Python
Python去除字符串两端空格的方法
May 21 Python
详解Python编程中基本的数学计算使用
Feb 04 Python
python PIL模块与随机生成中文验证码
Feb 27 Python
详解用python实现简单的遗传算法
Jan 02 Python
python实现桌面壁纸切换功能
Jan 21 Python
softmax及python实现过程解析
Sep 30 Python
python实现文件批量编码转换及注意事项
Oct 14 Python
python 命名规范知识点汇总
Feb 14 Python
python和php学习哪个更有发展
Jun 17 Python
Python实战之用tkinter库做一个鼠标模拟点击器
Apr 27 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
后宫无数却洁身自好的男主,唐三只爱小舞
2020/03/02 国漫
PHP 文件上传全攻略
2010/04/28 PHP
PHP正确配置mysql(apache环境)
2011/08/28 PHP
细谈php中SQL注入攻击与XSS攻击
2012/06/10 PHP
php绘图之生成饼状图的方法
2015/01/24 PHP
详解Window7 下开发php扩展
2015/12/31 PHP
微信公众号开发之语音消息识别php代码
2016/08/08 PHP
JS代码优化技巧之通俗版(减少js体积)
2011/12/23 Javascript
JavaScript设置首页和收藏页面的小例子
2013/11/11 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
JavaScript中的object转换成number或string规则介绍
2014/12/31 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
vue2.0+webpack环境的构造过程
2016/11/08 Javascript
原生js实现类似fullpage的单页/全屏滚动
2017/01/22 Javascript
nodejs一个简单的文件服务器的创建方法
2019/09/13 NodeJs
Angular进行简单单元测试的实现方法实例
2020/08/16 Javascript
python计算文本文件行数的方法
2015/07/06 Python
获取python文件扩展名和文件名方法
2018/02/02 Python
学习python的前途 python挣钱
2019/02/27 Python
python替换字符串中的子串图文步骤
2019/06/19 Python
Python 面向对象之封装、继承、多态操作实例分析
2019/11/21 Python
Python类反射机制使用实例解析
2019/12/30 Python
python 读txt文件,按‘,’分割每行数据操作
2020/07/05 Python
常用的10个Python实用小技巧
2020/08/10 Python
英国的潮牌鞋履服饰商店:size?
2019/03/26 全球购物
Hotels.com越南:酒店预订
2019/10/29 全球购物
触发器(trigger)的功能都有哪些?写出一个触发器的例子
2012/09/17 面试题
淘宝网店营销策划书
2014/01/11 职场文书
简历自我评价模版
2014/01/31 职场文书
师德师风个人反思
2014/04/28 职场文书
学校社会实践活动总结
2014/07/03 职场文书
领导班子遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
实习生矿工检讨书
2014/10/13 职场文书
毕业设计指导教师评语
2014/12/30 职场文书
新员工考核评语
2014/12/31 职场文书
煤矿安全学习心得体会
2016/01/18 职场文书