- 1、path和re_path
- path
- re_path
- 正则表达式规则
- 2、使用path捕获url中值示例
- 3、使用re_path捕获url中值示例
- 位置参数
- 位置参数练习
- url的命名参数(关键字参数)
- url的命名参数练习
在实际网站开发中,我们不会把所有信息都以参数形式传递到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 - 匹配零或任何正整数。返回一个int。
比如要匹配一个函数视图,该函数有两个形参:
def peopleList(request,book_id)
第一个request是默认的,那么路径自动匹配该函数的第二个形参,匹配格式:
path中第一个参数route使用的是非正则表达式可以表示的普通路由路径。而如果遇上路径和转换器语法都不足以定义的URL模式,那么就需要使用正则表达式,这时候就需要使用re_path(),而非path()。
正则表达式规则往往网站的资源是非常多的,如果每个资源都分配一个独立的URLConf,那么整个网站的代码维护会非常麻烦,所以为了URLConf的维护,django的URL采用了正则表达式来进行匹配,只有满足了匹配规则的,才会调用对应的视图函数执行。
任务:访问http://127.0.0.1:8000/study/13,页面返回study后的数字13。
(1)配置主路由
path("study/",include("apps.study.urls")),
(2)配置子路由
path('', views.detail),
(3)编写视图函数
def detail(request,x):
return HttpResponse(x)
关键字参数必须和形参一致。
(4)访问
使用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/(?Pd+)$',views.detail4),
注意名称必须和函数形参一致。
(2)编写视图函数
def detail4(request,book_id):
return HttpResponse(book_id)
(3)访问
url的命名参数练习通过url传递3个整数,使用命名参数在页面上输出3个整数的值。
re_path(r'^keyword/(?Pd+)/(?P d+)/(?P d+)/$',views.detail3),
注意名称必须和函数形参一致。2个路由匹配共同的detail3函数。



