文章目录
在实际网站开发中,我们不会把所有信息都以参数形式传递到web服务器上,这样的话,整个URL显得比较混乱,很多网站是把这种信息直接在URL中体现出来的。
比如:
https://www.jianshu.com/p/c36c54d4ca9a
https://www.jianshu.com/p/f78bd9f2bd30
通过最后的数字来代表不同的文章。
1、path和re_path
path
在django2.x
及以上版本中,描写url
配置的有两个函数path
和re_path
。
函数 path()
是写的非正则路由(route
),接下来主要看一下path()
函数的四个参数含义。
-
path()
参数route
: route是一个匹配URL的准则(类似正则表达式)。当Django
响应一个请求时,它会从urlpatterns
的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项。这些准则不会匹配GET
和POST
参数或域名。例如,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
的维护,django
的URL
采用了正则表达式来进行匹配,只有满足了匹配规则的,才会调用对应的视图函数执行。
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
函数。