栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Django18——反向路由及在视图中的使用

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Django18——反向路由及在视图中的使用

文章目录
  • 1、反向路由的概念
  • 2、给url起名字
  • 3、命名空间
  • 4、reverse功能
  • 5、示例——在视图中使用使用反向路由
  • 6、练习

在网站开发中,最多的元素就是 a标签了,每个网站都是由不同的链接组合起来,让用户通过点击进入不同的页面进而服务用户的。

在实际的业务开展中,很多URL的资源标识名并不是一成不变的,而是根据公司业务进行不断的改变,如果页面上的所有a标签的跳转都是写成字符串常量形式的话,那么如果一旦有一个业务的资源标识发生了改变,那么开发人员将会对所有的页面上的a标签进行手动修改内容,那简直是无法想象的工作量。

所以,在实际开发中,既然路由能正向指向了视图函数,那么有没有什么方法,能够通过一个标识找到路由信息,答案就是Django的反向路由模块来支持了。

1、反向路由的概念

我们的路由是一个匹配关系,对应一个处理的视图函数,
如果我们的匹配关系发生了变化,那么与之对应的访问地址(可能前端直接url链接,也可能是后端的redirect跳转)都需要跟着发生改变这是费时费力,因此我们想到了一种动态解析url的方法,通过给相应的匹配关系起别名,而让与之对应的链接或者跳转,会根据别名动态解析前面的匹配关系,这个动态解析url路径的过程就是反向解析。反向路由可以根据别名直接生成对应的url地址。

2、给url起名字

给url起名字:name。起名字用于反向解析。

name参数可以给这个url取一个合适的名字。通过给url取名字,以后在view或者模板中使用这个URL,就只需要通过这个名字就可以了。这样做的原因是防止url的规则更改,会导致其他地方用了这个url的地方都需要更改,但是如果取名字了,就不用做任何改动了。
给一个匹配的url地址取名字一般用于模板,也可以使用reverse进行页面重定向。

path('',views.index,name='index'),
path('', views.detail,name='detail'),
re_path(r'^test/(d+)$',views.newdetail,name='newdetail'), 
re_path(r'^(d+)/(d+)/(d+)/$',views.detail3,name='detail3'),
re_path(r'^keyword/(?Pd+)$',views.detail4,name='detail4'),
re_path(r'^keyword/(?Pd+)/(?Pd+)/(?Pd+)/$',views.detail3,name='detail5'),
3、命名空间

在不同的业务中,都有一个主页的概念,这样会有一种情况,每个app的设计者,都命名了一个name=‘index’的主页路由反向映射标识,那如何区别他们那?

Django给我们提供了一个叫做名字空间的概念,来区别不同app的同名标识。

在include方法内,有一个namespace的参数,他接收一个字符串作为子路由映射关系的命名空间。

path('study/',include(('apps.study.urls','study'),namespace='study')),

注意:

  • 在include方法里面指定namespace却不提供app_name是不允许的。
  • 在包含的模块里设置app_name变量,或者在include方法里面提供app_name参数。

(1)方式一:在include方法里面提供app_name参数

(2)方式二:在包含的模块里设置app_name变量

4、reverse功能

Django中提供了reverse函数来完成URL的反向查找功能,它仍然定义在django.urls模块中。
这个函数必须传递至少一个参数,这个参数就是url反向查找的标识信息,该信息需要在URL正向映射中,由程序员手动添加进去才行。

reverse函数里提供了args来代表位置参数,kwargs来代表命名参数。

5、示例——在视图中使用使用反向路由

前提:已经给url和include取名。
(1)配置路由

path('reverseTest/',views.reverseTest,name="reverseTest"),

(2)编写视图

def reverseTest(request):
    # 后端不带参数反向路由
    # path('', views.index, name='index'),
    d1 = reverse('study:index')

    # 后端位置参数反向路由
    # path('', views.detail, name='detail'),
    # re_path(r'^test/(d+)$', views.newdetail, name='newdetail'),  # r防止字符转义,表示非转义的原始字符
    # re_path(r'^(d+)/(d+)/(d+)/$', views.detail3, name='detail3'),
    d2 = reverse('study:detail',args=(10,))
    d3 = reverse('study:newdetail',args=(112,))
    d4 = reverse('study:detail3',args=(100,200,300))

    # 后端关键字参数反向路由
    # re_path(r'^keyword/(?Pd+)$', views.detail4, name='detail4'),
    # re_path(r'^keyword/(?Pd+)/(?Pd+)/(?Pd+)/$', views.detail3, name='detail5'),
    d5 = reverse('study:detail4',kwargs={'book_id':100})
    d6 = reverse('study:detail5',kwargs={'p2':100,'p3':200,'p1':300})

    msg = "后端不带参数反向路由" + d1 + "
" msg += "后端位置参数反向路由" + d2 + "
" + d3 + "
" + d4 + "
" msg += "后端关键字参数反向路由" + d5 + "
" + d6 return HttpResponse(msg)

(3)输入http://127.0.0.1:8001/study/reverseTest/查看效果

6、练习

将视图中使用的硬编码改成反向路由来实现。

path('redTest2/', views.redTest2,name='redTest2'),
return redirect(reverse('study:redTest2'))
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/925712.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号