【Django5】路由的定义与使用

系列文章目录

第一章 Django使用的基础知识
第二章 setting.py文件的配置
第三章 路由的定义与使用
第四章 视图的定义与使用
第五章 二进制文件下载响应
第六章 Http请求&HttpRequest请求类
第七章 会话管理(Cookies&Session)
第八章 文件上传实现
第九章 多种视图view
第十章 Django5模板引擎
第十一章 模型定义与使用
第十二章 ORM执行SQL语句和事务
第十三章 表单定义与使用
第十四章 内置Admin系统
第十五章 内置Auth认证系统



一、路由的定义

一个完整的路由包含:路由地址、视图函数(或者视图类)、可选变量和路由命名。

路由称为URL (Uniform Resource Locator,统一资源定位符),也可以称为URLconf,是对可以从互联网上得到的资源位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的路由,用于指出网站文件的路径位置。简单地说,路由可视为我们常说的网址,每个网址代表不同的网页。

前面的Hello World项目。我们请求的地址:

http://127.0.0.1:8000/index/

在这里插入图片描述

二、路由变量

在平时开发中,有时候一个路由可以代表多个不同的页面,比如博客系统里面,有1千个博客页面,按照前面学习的方式,需要写1千个路由才能实现,这种做法显然不可取,维护也麻烦。我们可以通过路由变量,来实现一个路由代表多个页面。

路由的变量类型有字符类型、整型、slug 和 uuid,最为常用的是字符类型和整型。各个类型说明如下。

  • 字符类型:匹配任何非空字符串,但不含斜杠。如果没有指定类型,就默认使用该类型。

  • 整型:匹配О和正整数。

  • slug:可理解为注释、后缀或附属等概念,常作为路由的解释性字符。可匹配任何ASCII字符以及连接符和下画线,能使路由更加清晰易懂。比如网页的标题是“15岁的孩子”,其路由地址可以设置为“15-sui-de-hai-zi”。

  • uuid:匹配一个uuid格式的对象。为了防止冲突,规定必须使用“”并且所有字母必须小写,例如175194d3-6885-437e-a8a8-6c231e272f00。

下面列举实例一 博客帖子请求:
首先urls.py里定义路由映射:
在这里插入图片描述
在urls.py文件中的urlpatterns中写入

path('blog/<int:id>', helloWorld.views.blog),

views.py里再定义blog函数实现:
在这里插入图片描述

def blog(request,id):
    return HttpResponse("这是id为" + str(id)+ "的博客页面")

运行测试访问http://127.0.0.1:8000/blog/55结果如下:
在这里插入图片描述
当然我们也可以带多个路由变量。让博客的路由地址,在带上年月日变量。
同理,urls.py里添加代码:

path('blog2/<int:year>/<int:month>/<int:day>/<int:id>', helloWorld.views.blog2),

在views.py里添加代码:

def blog2(request,year,month,day,id):
    return HttpResponse("今天是"+str(year)+ "年"+str(month)+"月"+str(day)+"日" +
                        "这是id为" + str(id)+ "的博客页面")

运行测试http://127.0.0.1:8000/blog2/2024/7/26/7860
在这里插入图片描述

三、正则路由

有时候我们为了更好的进行路由匹配,可以用正则表达式。比如前面讲的日期的路由变量,其实是有点问题的。

我们月份输入788,也是满足条件的。但是不符合实际,实际情况月份最多两位数
在这里插入图片描述
所以这时候,我们可以用正则表达式来限制。

urls.py修改:

    re_path('blog3/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/(?P<day>[0-9]{1,2})', helloWorld.views.blog3)

注意点:

  • 正则urls匹配,必须用re_path方法;
  • 正则表达式?P开头是固定格式;
  • <变量>;
  • [0-9]表示只能填写数字0-9;
  • {4}表示只能填写4位数;
  • {1,2}表示只能填写1或2位数;
  • 写了正则id就不能混用了

views.py修改:

def blog3(request, year, month, day):
    return HttpResponse(str(year) + '/' + str(month) + '/' + str(day) + '的博客页面')

运行测试http://127.0.0.1:8000/blog3/2024/13/1
在这里插入图片描述

四、路由重定向

重定向称为HTTP协议重定向,也可以称为网页跳转,它对应的HTTP状态码为301、302、303、307、308。简单来说,网页重定向就是在浏览器访问某个网页的时候,这个网页不提供响应内容,而是自动跳转到其他网址,由其他网址来生成响应内容。

Django的网页重定向有两种方式:

  • 第一种方式是路由重定向;

  • 第二种方式是自定义视图的重定向。

两种重定向方式各有优点,前者是使用Django内置的视图类RedirectView实现的,默认支持HTTP的GET请求;后者是在自定义视图的响应状态设置重定向,能让开发者实现多方面的开发需求。

我们分别用实例来演示下这两种方式:

1.路由重定向

路由重定向方式,我们用RedirectView实现,在urls.py里面,我们再加一个路由代码:

path('redirectTo', RedirectView.as_view(url="index/"))

运行测试访问:http://127.0.0.1:8000/redirectTo
发现网页自动重定向到index,状态是302。
自动重定向到index,状态是302。

2.自定义重定向

更多的情况,我们平时开发用的是自定义视图重定向,视图代码里,通过逻辑判断,通过redirect方法来实现具体的页面重定向,使用更加灵活。

我们改造下前面的views.py下的blog函数:假如id是0,重定向到错误静态页面。
在这里插入图片描述

views.py下的函数代码:

def blog(request,id):
    if id == 0:
        return redirect('/static/error.html')
    else:
        return HttpResponse("这是id为" + str(id)+ "的博客页面")

新建个目录common,目录下创建个error.html文件,在setting中的STATICFILES_DIRS中加入common目录
在这里插入图片描述
在这里插入图片描述

运行访问http://127.0.0.1:8000/blog/0,结果如下:
在这里插入图片描述
重定向状态为302,跳到了error页面。

五、命名空间namespace

当我们网站项目规模越来越多,子项目很多的时候,为了方便管理路由地址,我们可以采用命名空间namespace来对路由地址根据子项目分类。
创建子项目(app)user和order,两种方式
控制终端

python manage.py startapp user

工具 -> 运行manage.py任务 -> startapp order
在这里插入图片描述
结果如下:
在这里插入图片描述

我们分别添加urls.py到user和order项目里去。

以及加下代码

user项目的urls.py:
在这里插入图片描述

user项目的views.py:
在这里插入图片描述
在主项目里的urls.py中加入映射
在这里插入图片描述
path('应用名/’,include((‘应用名.urls’,'应用名‘),namespace='应用名’)) 注意()的个数,很容易少写一个()的。

include((‘user.urls’, ‘user’) 相当于找到user项目的urls.py文件。

namespace=‘user’ 给这个映射取名是user,一般是根据项目名称来取。

第一个参数 ‘user/’ 标识 user/开头的请求,都由user项目的urls.py去管理处理映射关系。

通过这种命名空间,我们可以把复杂项目的路由映射拆分,升级维护会方便很多。

运行测试结果:
在这里插入图片描述

六、路由命名与反向解析reverse与resolve

我们在urls.py里定义的路由信息,有时候需要动态获取路由信息,然后进行一些处理,统计,日志等操作,这时候我们需要在其他代码里用到路由信息,比如views.py,后面要学到的模型models.py,Admin系统等,因此我们引入路由反向解析reverse与resolve方法,再使用这两个方法前,我们还需要给路由取名,否则我们无法找到我们需要的那个路由的信息。reverse方法根据路由名称得到路由地址,resolve方法根据路由地址得到路由所有信息。

我们先举一个简单例子来体会下吧。

在order项目的urls.py里,我们对index/和list/请求路由分别取名index和list
在这里插入图片描述

views.py中写入下列代码在这里插入图片描述
访问网址后打印显示:
在这里插入图片描述

这是reverse反向解析得到的的路由地址 /order/index/
这是resolve通过路由地址得到的路由信息 ResolverMatch(func=order.views.index, args=(), kwargs={}, url_name='index', app_names=['order'], namespaces=['order'], route='order/index/')

resolve返回对象属性介绍:

函数方法说明
func路由的视图函数对象或视图类对象
args以列表格式获取路由的变量信息
kwargs以字典格式获取路由的变量信息
url_name获取路由命名name
app names与app name功能一致,但以列表格式表示
namespaces与namespace功能一致,但以列表格式表示
route获取整个路由的名称,包括命名空间

点开reverse方法:
在这里插入图片描述
必须参数viewname,以及一些可选参数:

  • viewname:代表路由命名或可调用视图对象,一般情况下是以路由命名name来生成路由地址的。

  • urlconf:设置反向解析的URLconf模块。默认情况下,使用配置文件 settings.py 的ROOT_URLCONF属性( 主项目文件夹的urls.py ).

  • args:以列表方式传递路由地址变量,列表元素顺序和数量应与路由地址变量的顺序和数量一致。

  • kwargs:以字典方式传递路由地址变量,字典的键必须对应路由地址变量名,字典的键值对数量与变量的数量一致。

  • current app:提示当前正在执行的视图所在的项目应用,主要起到提示作用,在功能上并无实质的作用。

了解了这些,做一个稍复杂的实例。
加上变量传递
在这里插入图片描述
增加了kwargs字典类型和args元组类型,再reverse中加其中一个参数即可
在这里插入图片描述
运行测试结果如下
在这里插入图片描述
在这里插入图片描述

总结

本章学习了Django5中路由的配置,主要就是配置urls.py文件,再配置views.py。打好基础,再接再厉!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值