django学习 四.django路由

路由简单来说就是根据用户请求的URL链接来判断对应的出来程序,并返回处理结果,也是就是URL和django的视图建立映射关系
django是如何处理一个请求?

当用户从Django的站点请求页面时,Django系统遵循以下步骤来执行的Python代码:

  1. 首先Django确定要使用的根URLconf模块,通过ROOT_URLCONF来设置,具体在settings.py配置文件中。但是如果传入 HttpRequest对象具有urlconf 属性(由中间件设置),则其值将用于替换ROOT\_URLCONF设置。

  2. Django加载该Python模块并查找该变量 urlpatterns。它是django.urls.path()和(或)django.urls.re_path()实例的序列(sequence)。urlpatterns表示路由模型,通过路由模型寻找里面具体的地址

  3. Django按顺序运行每个URL模式,并在匹配所请求的URL的第一个URL中停止。

  4. 一旦正则表达式匹配,Django将导入并调用给定的视图,这是一个简单的Python函数(或基于类的视图)。该视图会获得如下参数:

    • 一个HttpRequest实例。
    • 如果匹配的正则表达式没有返回任何命名组,那么来自正则表达式的匹配将作为位置参数提供。
    • 关键字参数由正则表达式匹配的任何命名组组成,由可选kwargs参数中指定的任何参数覆盖。django.urls.path\(\)django.urls.re_path\(\)
  5. 如果没有正则表达式匹配,或者在此过程中的任何一点出现异常,Django将调用适当的错误处理视图

下面我们具体讲一下路由的相关操作

首先,打开django的路由页面,可以看到系统已经配置好一个路由,这个路由访问就是django自带的后端管理系统

 

 启动项目,通过地址加路由的admin去访问,访问可直接到django的后端登录页面

接下来,我们设置一个自己的页面路由

设置页面,首先,要创建一个页面,在views里面创建我们需要的页面,打印一句话

 

路由分发 

因为我们的views是在项目里面,而url是在配置文件目录下的总路由里面,为了方便管理项目,一般会在对应的项目里面添加一个urls的子路由文件

要让系统识别子路由,需要导入方法:include(也被称为路由分发

 问题:django项目中多个app目录共用一个url容易造成混淆,后期维护也不方便

解决:使用路由分发,让每个app目录都单独拥有自己的urls
步骤:
1.在每个app目录都创建一个urls.py的文件
2.在视图veiws.py文件里面写入内容,然后在urls导入app目录下的views.py文件
 

 然后对应的内容拷贝到我们项目中的url中,导入views模块,然后写下对应的路径

path中的参数:第一个是我们访问的路由,第二个参数是对应路由访问后需要调用的内容

 然后启动项目,通过我们配置的路径去访问,看到内容即成功

 

当中做了一个什么事情呢

通过浏览器访问服务

    127.0.0.1:8000/abc ==>  root url(根路由) ==> 加载子路由(myweb/urls.py)

    ==> 正则匹配访问的路径(path) =-=> 视图函数(views.index)

    ==> views.py index() 响应内容

 

正则路径中的分组
通过正则可以模糊匹配我们要访问的页面
正则是通过分组按位置传参,一一对应的关系,views中除了request,其他形参的数量要与urls中分组数量一致,具体写法如下:

因为我们这里用了一个分组,所以在对应的views方法中也要传入一个形参

 带参数的路由

在有些时候,我们回指定路由的格式,比如限制子路由必须是3位数的数子之类的,这个时候,路由又该怎么写呢

在路由里面设置,通过/<数据类型:参数值>,表示要传入的参数,如下图我们传入的num是int型,访问只能通过int型才能访问这个地址

 在对应的视图方法里面,必须调用这个参数,可以给参数一个默认值,如果给了默认值,就算输入数字,也能自动带出

如果能看到对应的内容,就是访问成功

 

传入多个参数的写法也一样

 

命名空间

表示标识符的可见范围
一个标识符可在多个命名空间中定义,他在不同的命名空间是互不相干的
一个新的命令空间可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的
一个新的命名空间中可定义任何标识符,他们不会与任何重复的标识符发生冲突,因为重复的定义都处于其他命名空间中
存在问题:路由别名name没有作用域,Django在方向解析URL是,会在项目全局顺序搜索,当唱到第一个路由别名name指定URL时,立即返回。当在不同app目录下的urls中定义相同的路由别名name时,可能会导致url反向解析错误
解决方法:使用命名空间
如下图:两个app项目,路径别名都叫做name=“index”,

 

下图通过reverse查看他们的路径,不论是第一个myapp还是app

 

根据路由都是先查询第一个myapp,而不是app,这样他会默认打开第一个name=“index"名称的路由

为了解决这个问题,我们需要给name设置一个作用域,有两个方式
第一种:通过include来管理项目的URL,并进行namespace(命名空间)
include参数直接传一个元祖,元祖的第一个参数就是urls文件,第二个参数是namespace,相当于我们给这个目录取别名

 

 第二种:直接在路由添加命名空间,app_name=项目名

 

反向解析
随着功能的增加,路由层的url发生变化,就需要去改变对应的视图层和模板层的url,非常麻烦
可以利用反向解析,当路由层的url发生改变,在视图层和模板层动态方向解析出更改后的url,免去修改操作
反向解析一般用在模板中的超链接以及视图中的重定向
普通路径
在urls.py中给路由起别名,name="路由器别名"

 

posted @   另眼看尘世  阅读(847)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示