Django13——URL信息的截取

本文详细讲解了Django中path和re_path的区别,如何使用它们捕获URL中的位置参数和命名参数,以及通过实例展示了如何配置URL模式和编写视图函数。涵盖了正则表达式的应用和实际开发中的常见用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在实际网站开发中,我们不会把所有信息都以参数形式传递到web服务器上,这样的话,整个URL显得比较混乱,很多网站是把这种信息直接在URL中体现出来的。
比如:

https://www.jianshu.com/p/c36c54d4ca9a
https://www.jianshu.com/p/f78bd9f2bd30

通过最后的数字来代表不同的文章。

1、path和re_path

path

django2.x及以上版本中,描写url配置的有两个函数pathre_path

函数 path()是写的非正则路由(route),接下来主要看一下path()函数的四个参数含义。

  • path()参数route: route是一个匹配URL的准则(类似正则表达式)。当Django响应一个请求时,它会从urlpatterns的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项。这些准则不会匹配GETPOST参数或域名。例如,URLconf在处理请求https://www.example.com/myapp/时,它会尝试匹配myapp/。处理请求https://www.example.com/myapp/?page=3时,也只会尝试匹配 myapp/

  • path()参数view: 当 Django找到了一个匹配的准则,就会调用这个特定的视图函数,并传入一个HttpRequest对象作为第一个参数,被“捕获”的参数以关键字参数的形式传入。

  • path()参数kwargs: 任意个关键字参数可以作为一个字典传递给目标视图函数。

  • path()参数name: 为URL取名,能使你在 Django的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个URL模式。

path() 具有四个参数,两个必须参数:route 和 view;两个可选参数:kwargs 和 name。即路由和视图是必填参数。第一个参数route使用的是非正则表达式可以表示的普通路由路径。

注意:
要从URL捕获值,请使用尖括号。
捕获的值可以选择包括转换器类型。例如,用于 <int:name>捕获整数参数。
int - 匹配零或任何正整数。返回一个int

比如要匹配一个函数视图,该函数有两个形参:

def peopleList(request,book_id)

第一个request是默认的,那么路径自动匹配该函数的第二个形参,匹配格式:<int:book_id>,并返回一个正整数或零值。
在这里插入图片描述

re_path

path中第一个参数route使用的是非正则表达式可以表示的普通路由路径。而如果遇上路径和转换器语法都不足以定义的URL模式,那么就需要使用正则表达式,这时候就需要使用re_path(),而非path()

正则表达式规则

往往网站的资源是非常多的,如果每个资源都分配一个独立的URLConf,那么整个网站的代码维护会非常麻烦,所以为了URLConf的维护,djangoURL采用了正则表达式来进行匹配,只有满足了匹配规则的,才会调用对应的视图函数执行。
在这里插入图片描述
在这里插入图片描述

2、使用path捕获url中值示例

任务:访问http://127.0.0.1:8000/study/13,页面返回study后的数字13
(1)配置主路由

path("study/",include("apps.study.urls")),

(2)配置子路由

path('<int:x>', views.detail),

在这里插入图片描述
(3)编写视图函数

def detail(request,x):
    return HttpResponse(x)

在这里插入图片描述
关键字参数必须和形参一致。
(4)访问
在这里插入图片描述

3、使用re_path捕获url中值示例

使用re_path捕获url中的值,有位置参数和命名参数(关键字参数)两种:
在这里插入图片描述

位置参数

这种信息的获取的方式是在URLConf中,使用()符号把里面需要的内容截取出来。
使用re_path\d+应用小括号(\d+),视图函数必须接受参数。
(1)配置子路由

re_path(r'^test/(\d+)$',views.newdetail), #r防止字符转义,表示非转义的原始字符

在这里插入图片描述
(\d+)括号,不表示括号本身,表示获取的意思。
\(\d+\),这样写,才表示括号本身。

(2)编写视图函数
视图函数必须接受url的位置参数。

def newdetail(request,id):
    return HttpResponse(id)

(3)测试
希望 newdetail执行,该怎么写请求?
在这里插入图片描述

位置参数练习

通过url传递3个整数,在页面上输出3个整数的值。

re_path(r'^(\d+)/(\d+)/(\d+)/$',views.detail3), #位置参数
def detail3(request,p1,p2,p3):
    info = "p1={},p2={},p3={}".format(p1,p2,p3)
    return HttpResponse(info)

在这里插入图片描述

url的命名参数(关键字参数)

位置参数有时候并不能很好的描述用户意图,所以Django也提供在匹配URL时对截取信息进行命名参数的传递,采用的方法就是用?P<名称>符号来进行名称命名。

关键字参数:在小括号中(?P<变量名>)P是大写。

url中传递一个整数,使用关键字参数实现如下:

(1)配置子路由

re_path(r'^keyword/(?P<book_id>\d+)$',views.detail4),

注意名称必须和函数形参一致。

(2)编写视图函数

def detail4(request,book_id):
    return HttpResponse(book_id)

(3)访问

在这里插入图片描述

url的命名参数练习

通过url传递3个整数,使用命名参数在页面上输出3个整数的值。

re_path(r'^keyword/(?P<p2>\d+)/(?P<p3>\d+)/(?P<p1>\d+)/$',views.detail3),

注意名称必须和函数形参一致。2个路由匹配共同的detail3函数。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值