django中的路由层

1.什么是路由层

简单来说,就是通过路由层中的path函数,告诉django遇到那个url,执行那个视图函数

2.路由层的请求流程

1.客户在浏览器输入网址→请求进入django的setting.py中的ROOT_URLCONF寻找指定使用的urls.py文件位置(如果中间件有路由功能,urls文件功能会被其替代)

2.Django会先匹配项目目录下的path路径然后在匹配应用里面的url路径,从上至下查找url匹配,一旦匹配成功,停止查找。

3.一旦匹配url成功后,路由层向视图层传递下列参数:
        1)一个HttpRequest实例,即request
        2)如果url中的可变参数没有命名,那么就按照位置来与视图函数中的形参一一对应,如果有则按关键字方式传参

4.如果匹配不到url,Django会发出异常

re_path(r'^test/$',views.test)
注意:path路径匹配是会自动在url后面加上一个斜杠,即先匹配test没有找到,会自动加个/在匹配一次!

如何取消自动加斜杠?
在setting.py里添加APPEND_SLASH = False 默认是True

3.路由层的格式和参数说明

3.1有名分组和无名分组

分组:就是给某一段正则表达式用小括号扩起来

无名分组:就是将括号内的正则表达式匹配到的内容当做位置参数传递给后面的视图函数

from django.urls import path, re_path
re_path(r'^test/(\d+)/',views.test)

def test(request,xx):  # xx这个参数就是对应path里面的(\d+)
    pass
	
# 补充:path里面views.xxx,后面也可以在加一个参数(字典形式),该参数可以被传到视图函数,视图函数request后面在加个参数(字典的key)
有名分组:可以给正则表达式起个别名

from django.urls import path, re_path
re_path(r‘^(?P<自定义参数名>正则表达式)/$',view.xxx),

def test(request,自定义参数名):
    pass

有名无名不能混用!单个分组可以使用多次!

3.2url反向解析

反向解析的步骤:

# 1.先给改url起一个别名
re_path(r'^test/$',views.test,name='ooo')

# 2.后端反向解析(视图层)
先导入reverse
from django.shortcuts import reverse
print(reverse(‘ooo’)) # 得到的就是对应别名的url

# 3.前端反向解析
在需要url的地方,改成如下格式:
<a href='{% url 'ooo' %}'>111</a>

3.3有名无名的反向解析

1.无名分组
后端部分:

先导入reverse
from django.shortcuts import reverse
print(reverse(‘ooo’),args=(1,))#需要传一个对应参数args,里面的1可以让正则表达式匹配到

前端部分:
<a href='{% url 'ooo' 123 %}'>111</a>
# 123是匹配到url的正则表达式

2.有名分组
其实是和无名分组一样的,但是也可以写成关键字方式传参
print(reverse(‘ooo’),kwargs={‘year’:1111}))
<a href='{% url 'ooo' year=1111>

传入的数字参数一般是数据的主键值!!

3.4路由分发

起因:分布式路由是基于django应用诞生的,有了应用则就应该有分布式路由,主路由不用在处理用户具体路由了,而是转而做请求的分发,具体的请求由各自的应用负责。

主路由语法:
from django.urls import path,include
# 匹配http://127.0.0.1:8000/music/index--music应用path('music/', include('music.urls'))
include('app名字.url模块名')
作用是将当前path里面music路由转到include里面的这个应用路由里处理

子路由语法:
手动创建一个urls.py,结构和主路由完全一样
只是path后面的第一个参数,只需管主路由path匹配的后面一部分

3.5名称空间

在各路由起别名的时候,由于我们采用的是分布式路由开发,很有可能每个开发人员起的别名是一样的,这样我们在进行反向解析的时候就没有用了!

因此,名称空间的使用很好的解决了这一问题!具体的语法如下:

# 总路由
    re_path(r'^app01/',include('app01.urls',namespace='app01')),
    re_path(r'^app02/',include('app02.urls',namespace='app02'))
# 解析的时候
# app01
urlpatterns = [
    url(r'^reg/',views.reg,name='reg')
]
# app02
urlpatterns = [
    url(r'^reg/',views.reg,name='reg')
]
# 视图层:
reverse('app01:reg')
reverse('app02:reg')
# 模板层:
{% url 'app01:reg' %}
{% url 'app02:reg' %}

但其实,我们在起别名的时候只要保证别名不冲突,就没有必要使用名称空间。

一般情况下,有多个app的时候我们在起别名的时候会加上app的前缀,如name=‘app01_xxx’,这样就能解决了!

3.6路由层的转换器

path('page/<int:num>', views.test),
说明:1.path转换器:可以用来批量匹配一百个网页分别为page/1、page/2...等
2.语法为:<转换器类型:自定义名>
3.作用:若转换器类型匹配到对应类型的数据,则将数据按照关键字传参的方式传递给视图函数
4.转换器的类型:str:匹配除了'/'之外的非空字符串;int:匹配0或者任何正整数;# slug:匹配任意由ascll字母或数字以及连字符和下划线组成的短标签;path:匹配非空字段。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django中的路由层 - Python技术站

(0)
上一篇 2023年4月2日 下午5:02
下一篇 2023年4月2日 下午5:02

相关文章

  • flask操作数据库

    flask操作数据库 准备工作 安装flask-script(版本过高可能会报错) pip install flask-script==2.0.3 使用flask-script里的Manager类实例化来管理项目的启动等 from apps import create_app from flask_script import Manager app = cr…

    2023年4月2日
    00
  • 变量与常量

    1.什么是变量 变量是指可以变化的量,量指的是事物的状态,比如年龄,金钱、身高等等 2.为什么要有变量 为了能够让计算机像人一样记忆某一种事物的状态,并且这个状态是可以发生变化的。 程序的执行其实本质就是一系列状态的变化! 3.如何使用变量 (1)变量的基本使用 # 原则:先定义,再引用 name=’zhang’ print(name) (2) 内存管理(垃…

    2023年4月2日
    00
  • 免费课页面前端搭建和后端课程分类接口、课程群查接口设计

    免费课页面前端搭建 点击查看代码 <template> <div class=”course”> <Header></Header> <div class=”main”> <!– 筛选条件 –> <div class=”condition”> <ul class=”…

    Python开发 2023年4月2日
    00
  • 源码分析之序列化器的many关键字

    在序列多个数据时,我们需要指定一个关键字many=True 这是为什么呢? 其实是,当序列化器产生对象时,传入参数many和不传入会生成两个不同的对象!! 这是怎么实现的呢?? 1.类的对象生成–先调用类的__new__方法生成一个空对象2.对象 = 类名(name=‘lz’)–会触发类的__init__方法,产生一个有属性的对象3.类的__new__方…

    2023年4月2日
    00
  • django中的cookie、session和token

    发展史 1.早期的时候,网站都没有保存用户功能的需求,所有用户访问网站返回的结果都是一样的,比如新闻、文章等网站! 2.但是,随着网站的发展,出现了一些需要保存用户信息的网站,比如:淘宝、京东、个人博客等! 3.以登录功能为例,如果不保存用户登录的信息,就意味着用户每次都需要重新登录网站,为此非常的麻烦。 4.为了解决上述的麻烦,便产生了cookie和ses…

    2023年4月2日
    00
  • django中的auth模块与admin后台管理

    1. auth模块 在创建完django项目之后,执行数据库迁移之后,数据库里会增加很多新表,其中有一张名为auth_user的表,当访问django自带的路由admin的时候,需要输入用户名和密码,其参照的就是auth_user表 使用python3 manage.py crataesupperuser 可以创建超级管理员用户,同时在auth_user表里…

    2023年4月2日
    00
  • for循环语法

    for循环 for循环常用来遍历取值! for循环的基本语法 for 变量名 in 可迭代对象: 代码1 代码2 … # 可迭代对象可以是字典、列表、字符串、元组、集合 for + range range是用来控制for循环次数的方法 for i in range(1,9): print(‘====’) # range(1,9)循环1-8次,括号是顾头不…

    Python开发 2023年4月2日
    00
  • 计算机介绍和五大组成

    1. 什么是计算机 计算机俗称‘电脑’,通电的人脑。其实,计算机所有的组成部分,都是模仿人的某一个功能或者器官。 2. 为什么要有计算机 为了执行人类通过编程语言编写的文件程序,从而把人类解放出来。 3.计算机的组成部分 计算机有五大组成部分:控制器、运算器、存储器、输入设备、输出设备。 3.1 控制器 它是计算机的指挥系统,负责控制计算机其他的组件如何进行…

    2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部