django 系列(二)之路由
前言
url路由官网地址:
https://docs.djangoproject.com/en/4.2/topics/http/urls/
以下是几个url配置模板:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
一、url路由配置
1.1、根路由
主程序目录下的urls.py文件; settings文件中对应属性是ROOT_URLCONF 当项目中application比较少时,可以都是用根路由配置from django.contrib import admin
from django.urls import path, include
from user.views import *
urlpatterns = [
path('admin/', admin.site.urls),
# 1、配置一个最简单的函数视图的路由
path('index/', index, name='index'),
# 2、配置一个最简单的类视图的路由
path('index/', Index.as_view(), name='index'),
]
# path 函数的参数
def _path(route, view, kwargs=None, name=None):
pass
它可以接收 4 个参数,其中前两个是必填参数,后三个为可选参数。参数解析如下:
route:是一个匹配 URL 的准则(类似正则表达式)。当 Django 响应一个请求时,它会从 urlpatterns 的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项,然后执行该项映射的视图函数或者 include 函数分发的下级路由,因此,url 路由的编写在 Django中十分的重要!
view:指的是处理当前 url 请求的视图函数。当 Django 匹配到某个路由条目时,自动将封装的 HttpRequest 对象作为第一个参数,被“捕获”的参数以关键字参数的形式,传递给该条目指定的视图函数。
kwargs:指使用字典关键字传参的形式给关联的目标视图函数传递参数。
name:为你的 URL 取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个 URL 模式。
给 URL 起个别名,常用于 url 的反向解析,避免在模板中适应硬编码的方式使用嵌入 url
注意:name的作用是用于反向解析,在下文会讲到反向解析
1.2、根路由include函数
当项目中application较多时,都采用根路由配置会比较混乱,此时可以采用子路由配置# 1、在根路由中配置include包含子路由配置文件
from django.contrib import admin
from django.urls import path, include
from user.views import *
urlpatterns = [
path('admin/', admin.site.urls),
# 配置子路由urls文件
path('user/', include('user.urls', namespace='user'))
]
# 2、在子路由url文件中继续配置该子路由
from django.urls import path
from user.views import *
app_name = user
urlpatterns = [
path('index/', index)
]
# include 函数的参数
def include(arg, namespace=None):
pass
注意:namespace是可选参数,也是用于反向解析
解释:
1、arg可以是字符串(即'user.urls'),也可以是一个元组(例如('user.urls',user))
2、如果是元组的话,第二个参数user必须和子路由中的app_name 保持相同值,否则会报错
3、如果是字符串,并且namesapce也存在,则子路由中app_name必须存在,否则报错,如果namesapce不存在,则app_name可以也不存在
4、这个地方会有点乱,一般建议写成如下方式:
根路由中写成 path('user/', include('user.urls', namespace='user'))
子路由中加上 app_name = user
这样肯定不会有问题
1.3、路由介绍扩展
1. django 1.0中 和 django 2.0 中 路由配置的区别
url是Django 1.x中的写法,在Django2.1中,开始舍弃Django1.x中的url写法。在Django2.x中,描写url配置的有两个函数path和re_path,re_path()函数可以看做是django 1.x中得url函数,即可以在路径中使用正则。 但是之前的 url 模块并没有废止,只是 Django 强烈建议我们使用新模块 path 进行路由的匹配。 django.urls.path 函数,它允许使用一种更加简洁、可读的路由语法。比如之前的版本的代码:
#1.x url方法
url(r'^test/(?P<year>[0-9])/$', views.year_test),
#2.x path方法
path('test/<int:year>/', views.year_test),
2. Django中 url和path都是配置路径,有什么区别?
from django.urls import path
from django.conf.urls import url
path 与url 是两个不同的模块,效果都是响应返回页面,path 调用的是python 第三方模块或者框架,而url是自定义的模块,如views 下的def 函数对应url的参数值
默认url(route, view, kwargs=None, name=None)
默认path(route, view, kwargs=None, name=None)
默认re_path(route, view, kwargs=None, name=None)
django.urls.path 可以看成是 django.conf.urls.url 的增强形式。
二、url传参
path 方法引入了类型转化器(converter type)的概念,以此省去了较为复杂的正则表达式匹配路由的方法。这个类型转化器就是可以不再使用正则去传参了
# 1、传参介绍
from django.contrib import admin
from django.urls import path, include
from user.views import *
urlpatterns = [
path('admin/', admin.site.urls),
# 没传入参数
path('index/', index)
# 传入参数
path('index/<num>', index) # 不写参数的数据类型默认是字符串,但是在视图函数中会将捕获到的字符串值自动转换为对应的数据类型,而不用手动转换
path('index/<int:num>', index) # 写参数的数据类型
# 传入多个参数
path('index/<int:num>/<str:name>', index)
注意:<> 括号是固定写法;int表示数据类型,字符串就是str,也可以不写数据类型; : 后面的是参数名,该参数名必须和视图函数中的参数名保持一致。
# 如果传参,那么在对应的视图函数中就要接收参数,且url中的参数名和视图函数中的参数名必须保持一致:
def index(request,num, name):
pass
# 2、五种类型转化器
path方法类型转化器
Django 默认支持 5 个类型转换器,在大多数情况下,绝对可以满足我们的正常业务需求,如果不能,Django 同样提供了自定义转换器。
Django 默认支持的转换器,如下所示:
str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式;
int,匹配正整数,包含0;
slug,匹配字母、数字以及横杠、下划线组成的字符串;
uuid,匹配格式化的 uuid,如 075194d3-6885-417e-a8a8-6c931e272f00;
path,匹配任何非空字符串,包含了路径分隔符
之所以使用转化器,有以下两个原因:
第一是可以将捕获到的字符值转换为对应的类型;
第二是对 URL 中传值的一种限制,避免视图处理出错;
三、url正则匹配
如果路径和转化器语法不能很好的定义你的 URL 模式,你可以可以使用正则表达式。如果要这样做,请使用 re_path() 而不是 path() 。在 Python 正则表达式中,命名正则表达式组的语法是 (?P<name>pattern) ,其中?P是固定写法, name 是组名,pattern 是要匹配的模式。
正则表达式的开始使用“^”表示。
正则表达式的结束使用“$”表示。
“r” 元字符串 防止正则表达式中的转义。
例如上面通过转化器写的url可以通过正则表达式重写:
"""
from django.urls import path, re_path
from news import views
#urlpatterns = [
# path('list3/<int:year>/', views.list3)
# path('list4/<int:id>/', viewss.list4)
#]
urlpatterns = [
re_path(r'^list3/(?P<year>[0-9]{4})/&', views.list3)
re_path(r'^list4/(?P<id>[0-9])/&', viewss.list4)
]
# 一些常用的正则表达式语法。
^:匹配字符串的开头。
$:匹配字符串的结尾。
.:匹配除换行符以外的任何字符。
\d:匹配任何十进制数字。
\D:匹配任何非数字字符。
\w:匹配任何字母数字字符。
\W:匹配任何非字母数字字符。
\s:匹配任何空白字符。
\S:匹配任何非空白字符。
*:匹配前面的表达式零次或多次。
+:匹配前面的表达式一次或多次。
?:匹配前面的表达式零次或一次。
{n}:匹配前面的表达式恰好n次。
{n,}:匹配前面的表达式至少n次。
{n,m}:匹配前面的表达式至少n次、最多m次。
[a-zA-Z]表示匹配所有英文字母中的任意一个字母
[0-9]表示任意一个数字
\d+表示前面的数字,出现一次或者多次
[0-9]{4}表示数字需要出现4次

浙公网安备 33010602011771号