Django路由
路由系统
- 1.Django1中的路由
- 1.1 普通形式
- 1.2 分组
- 1.2.1 无名分组
- 1.2.2 有名分组
- 2. Django2+版本
- 2.1 传统的路由
- 2.2 正则表达式路由
- 3. 路由分发
- 3.1 include(一般使用此方式做路由分发)
- 3.2 手动分发
- 4. name别名及使用name的反向URL生成
- 4.1 一般情况下的别名使用及反向生成
- 4.2 分组中方向解析URL
- 5. 名称空间
1.Django1中的路由
1.1 普通形式
在Django1的版本中,普通路由url进行匹配,其格式如下:
urlpatterns = [url(regex, view, kwargs=None, name=None), ]
- url的regex参数,即第一个参数为正则表达式
- view参数通常为视图函数,用来处理业务逻辑
- kwargs:接收传递给视图函数的参数
- name:为regex参数地址的别名,在地址过长时可用别名反向解析
示例:
urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^index$',views.index)
]
PS:需要注意
- 正则表达式不需要添加一个前导的反斜杠,因为每个URL都有。例如,应该是^index而不是 ^/index
- 每个正则表达式前面的’r’ 是可选的但是建议加上
- 如果我们想匹配的路径就只是index/,那么正则表达式应该有开始符与结束符, 如 ^index/$。这样逻辑才算严谨
- 若正则为
r'index/'
在浏览器输入:http://127.0.0.1:8001/index/,Django会拿着路径部分index/去路由表中自上而下匹配正则表达式,一旦匹配成功,则立即执行其后的视图函数,不会继续往下匹配,此处匹配成功的正则表达式是r'^index/$'
。- 无论是否书写最后的/,都可以匹配成功,是因为配置中APPEND_SLASH默认为True且并不会出现在配置文件中,若想精确匹配最后的/则应该去settings文件中将APPEND_SLASH设置为False。
1.2 分组
分组实际上可以理解为get请求的第二种方式:
- get请求的第一种方式:
http://127.0.0.1:8000/test/?a=1&b=2- get请求的第二种方式:
http://127.0.0.1:8000/test/123/11
1.2.1 无名分组
无名分组实际上是re的分组写法,即把正则中小括号里的匹配到的内容以位置参数的形式传递给视图函数,如下:
urls.py文件
from django.contrib import admin
from django.conf.urls import url
from app01 import viewsurlpatterns = [# 下述正则表达式会匹配url地址的路径部分为:article/数字/,匹配成功的分组部分会以位置参数的形式传给视图函数,有几个分组就传几个位置参数url(r'^article/(\d+)/$',views.article),
]
views.py文件
from django.shortcuts import render
from django.shortcuts import HttpResponse# 需要额外增加一个形参用于接收传递过来的分组数据
def article(request,article_id):return HttpResponse('id为 %s 的文章内容...' %article_id)
测试:
python manage.py runserver 8001 # 在浏览器输入:http://127.0.0.1:8001/article/3/ 会看到: id为 3 的文章内容...
1.2.2 有名分组
当我们对分组命名后,就会按照key=value的关键字参数形式为视图函数传参,示例如下:
urls.py
from django.contrib import admin
from django.conf.urls import url
from app01 import viewsurlpatterns = [url('admin/', admin.site.urls),# 该正则会匹配url地址的路径部分为:article/数字/,匹配成功的分组部分会以关键字参数(article_id=匹配成功的数字)的形式传给视图函数,有几个有名分组就会传几个关键字参数,需要强调一点是:视图函数得到的值均为字符串类型url(r'^article/(?P<article_id>\d+)/$',views.article),
]
views.py
from django.shortcuts import render
from django.shortcuts import HttpResponse# 需要额外增加一个形参,形参名必须为article_id
def article(request,article_id):return HttpResponse('id为 %s 的文章内容...' %article_id)
测试:
python manage.py runserver 8001 # 在浏览器输入:http://127.0.0.1:8001/article/3/ 会看到: id为 3 的文章内容...
普通分组和命名分组都是为了获取路径中的参数,并传递给视图函数,区别在于普通分组是以位置参数的形式传递,命名分组是以关键字参数的形式传递。但请注意,有名分组和无名分组不要同时使用。
2. Django2+版本
2.1 传统的路由
在Django2以上的版本中,默认的路由通过path精准匹配来识别,避免了正则可能出现的一些匹配的问题。
格式如下:
urlpatterns = [path('admin/', admin.site.urls),path('',views.show_user_info),path('show/', views.show_user_info),path('del/', views.del_user_info),path('update/', views.update_user_info),path('insert/', views.insert_user_info)
]
其用法同url并无太大区别,path的第一个参数是精确匹配。
2.2 正则表达式路由
burpatterns = [re_path(r'users/(?<xxid>\w+-\d+)/',views.users),
]
Django2+版本的re_path的用法同Django1的url完全相同,不做过多描述。
3. 路由分发
当功能较多时,都写在一个urls文件中显然并不合适,可以使用路由分发将功能拆分带不同的app中。
3.1 include(一般使用此方式做路由分发)
include('app命字.url模块名')
- 模块app命字/url模块名.py 文件件里必须有urlpatterns 列表
- 使用前需要使用 from django.conf.urls import include 导入此函数
示例:
djangoproject1/urls.py
from django.urls import path,include
urlpatterns = {path('api/', include('apps.api.urls')),path('web/', include('apps.api.urls'))
}
apps/api/urls.py
from django.urls import path
from apps.api import viewsurlpatterns = {# api/auth/path('auth/',views.auth),# api/login/path('login/',views.login)
}
path本身支持五种转换器。
- str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
- int,匹配正整数,包含0。
- slug,匹配字母、数字以及横杠、下划线组成的字符串。
- uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
- path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
例如:
path('articles/<int:year>/', views.year_archive), # <int:year>相当于一个有名分组,其中int是django提供的转换器,相当于正则表达式,专门用于匹配数字类型,而year则是我们为有名分组命的名,并且int会将匹配成功的结果转换成整型后按照格式(year=整型值)传给函数year_archive
但是当本身条件较为复杂时,五种转换器可能并不能实现要求。针对这一系列复杂的需要,我们可以定义自己的转化器。转化器是一个类或接口,它的要求有三点:
-
regex 类属性,字符串类型
-
to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
-
to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。
示例如下:
在app01下新建文件path_ converters.py,文件名可以随意命名
class MonthConverter:regex='\d{2}' # 属性名必须为regexdef to_python(self, value):print('===>to_python run')return int(value)def to_url(self, value):print('===>to_url run')return value # 匹配的regex是两个数字,返回的结果也必须是两个数字
在urls.py中,使用register_converter 将其注册到URL配置中:
from django.urls import path,register_converter
from app01.path_converts import MonthConverterregister_converter(MonthConverter,'mon')from app01 import viewsurlpatterns = [path('articles/<int:year>/<mon:month>/<slug:other>/', views.article_detail, name='aaa'),]
views.py中的视图函数article_detail
from django.shortcuts import render,HttpResponse,reversedef article_detail(request,year,month,other):print(year,type(year))print(month,type(month))print(other,type(other))print(reverse('aaa',args=(1988,12,'hello'))) # 反向解析结果/articles/1988/12/hello/return HttpResponse('xxxx')
测试
# 1、在浏览器输入http://127.0.0.1:8000/articles/2009/12/hello/,path会成功匹配出参数year=2009,month=12,other='hello'传递给函数article_detail
# 2、在浏览器输入http://127.0.0.1:8000/articles/2009/123/hello/,path会匹配失败,因为我们自定义的转换器mon只匹配两位数字,而对应位置的123超过了2位
3.2 手动分发
path('user/', ([path('add/', views.login),path('delete/', views.login), # /user/delete/path('edit/', views.login),path('list/', views.login),], None, None)),
纯粹帮助提取功能的URL,防止重复编写。
4. name别名及使用name的反向URL生成
4.1 一般情况下的别名使用及反向生成
别名的使用
from django.urls import path
from app01 import views
urlpatterns = [path('login/', views.login, name="v1"),path('auth/', views.auth, name="v2"),
]
视图函数中反向生成URL
from django.urls import reverse
url = reverse("v2") # /auth/
url = reverse("v1") # /login/
HTML模版中反向生成
<a href="{% url 'v1' %}">添加</a>
<a href="{% url 'v2' %}">添加</a>
4.2 分组中方向解析URL
无名分组反向解析
url(r'^v1/v2/v3/home/(\d+)/(\d+)/$', views.home, name='home')
# 后端解析
res=reverse('home', args=(123, 11)) # /v1/v2/v3/home/1
print(res)# 前端解析
<a href="{% url 'home' 1 123 %}">点我看美女</a>
有名分组反向解析
url(r'^v1/v2/v3/home/(?P<year>\d+)/(?P<mon>\d+)/$', views.home, name='home')
# 后端解析
res=reverse('home', args=(123, 11)) # /v1/v2/v3/home/1
res=reverse('home', kwargs={'year':123, 'mon':1}) # /v1/v2/v3/home/1
print(res)# 前端解析
<a href="{% url 'home' year=1 mon=123 %}">点我看美女</a>
5. 名称空间
避免name重复可将重名name分别放入不同的namespace
- 主路由
from django.urls import path, re_path, include# 很多功能,很多URL urlpatterns = [path('api/', include("apps.api.urls",namespace='x1')),path('web/', include("apps.web.urls",namespace='x2')), ]
- api/urls.py
from django.urls import path, re_path from . import views # 很多功能,很多URL urlpatterns = [path('login/', views.login,name="login"),path('auth/', views.auth, name='auth'), ]
- web/urls.py
from django.urls import path, re_path from . import views # 很多功能,很多URL urlpatterns = [path('home/', views.home,name='home'),path('order/', views.order,name='order'),path('auth/', views.order, name='auth'), ]
反向生成
from django.urls import reverse
url = reverse("x1:login") # /api/login/
url = reverse("x1:order") # /web/login/url = reverse("x1:auth") # /api/login/
url = reverse("x2:auth") # /web/login/
相关文章:
Django路由
路由系统 1.Django1中的路由1.1 普通形式1.2 分组1.2.1 无名分组1.2.2 有名分组 2. Django2版本2.1 传统的路由2.2 正则表达式路由 3. 路由分发3.1 include(一般使用此方式做路由分发)3.2 手动分发 4. name别名及使用name的反向URL生成4.1 一般情况下的别名使用及反向生成4.2 分…...
头歌实践平台-数据结构-二叉树及其应用
第1关:实现二叉树的创建 #include "binary_tree.h"BiTreeNode* CreatBiTree(char* s, int &i, int len) // 利用先序遍历创建二叉树 // 参数:先序遍历字符串s,字符串初始下标i0,字符串长度len。 // 返回࿱…...

2023.11.11通过html内置“required-star“添加一个红色的星号来表示必填项
2023.11.11通过html内置"required-star"添加一个红色的星号来表示必填项 在HTML中,可以使用标签来为元素添加说明。同时可以通过添加一个红色的星号来表示必填项。 <!DOCTYPE html> <html lang"en"> <head><meta charse…...
pcie【C#】
根据提供的引用内容,使用C#编写PCIE的Demo需要遵循以下步骤:1.连接好硬件后,烧录bit文件,安装PCIe内核驱动,然后重启计算机。2.打开VS工程,创建一个新的C#控制台应用程序项目。3.在项目中添加对C DLL的引用…...

西门子精智屏数据记录U盘插拔问题总结
西门子精智屏数据记录U盘插拔问题总结 注意: 数据记录过程中不允许带电插拔 U 盘! 数据记录的相关功能可参考以下链接中的内容: TIA博途wincc V16 如何进行变量周期归档?...
(论文阅读27/100)Deep Filter Banks for Texture Recognition and Segmentation
27.文献阅读笔记 简介 题目 Deep Filter Banks for Texture Recognition and Segmentation 作者 Mircea Cimpoi, Subhransu Maji, Andrea Vedaldi, 原文链接 http://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Cimpoi_Deep_Filter_Banks_2015_CVPR_pap…...
ARMday06(串口)
代码: #include "gpio.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_uart.h" void init(); char getc(); void putc(const char data); int main() {init();//初始化putc(j);char …...
Rust字符串详解
文章目录 字符串切片String迭代方法基础字符串方法容量操作增删改查 字符串切片 我们所熟知的由双引号括起来的字符串,在Rust中只是个字符串切片,又叫字符串字面值。这种类型一旦创建,则不可更改。但支持索引,从切片中索引出来的…...

(四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
一、七种算法(DBO、LO、SWO、COA、LSO、KOA、GRO)简介 1、蜣螂优化算法DBO 蜣螂优化算法(Dung beetle optimizer,DBO)由Jiankai Xue和Bo Shen于2022年提出,该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖…...

Window安装MongoDB
三种NOSQL的一种,Redis MongoDB ES 应用场景: 1.社交场景:使用Mongodb存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人,地点等功能 2.游戏场景:使用Mongodb存储游戏用户信息,用户的装备,积分等直接以内嵌文档的形式存储,方便查询,高效率存储和访问…...

20.有效的括号(LeetCode)
思路:用栈的后进先出的特性,来完成题目的要求 因为C有库,可以直接用,而C语言没有,所以我们直接把写好的栈拷贝上来用。 首先,完成框架的搭建 其次,再实现循环内的部分。1.左括号入栈 2.右括…...
Vue3组件传参之Mitt插件方式
在vue3中$on,$off 和 $once 实例方法已被移除,组件实例不再实现事件触发接口,因此大家熟悉的EventBus便无法使用了。然而我们习惯了使用EventBus,对于这种情况我们可以使用Mitt库(其实就是我们视频中讲的发布订阅模式的…...

【数据仓库】数仓分层方法
文章目录 一. 数仓分层的意义1. 清晰数据结构。2. 减少重复开发3. 方便数据血缘追踪4. 把复杂问题简单化5. 屏蔽原始数据的异常6. 数据仓库的可维护性 二. 如何进行数仓分层?1. ODS层2. DW层2.1. DW层分类2.2. DWD层2.3. DWS 3. ADS层 4、层次调用规范 一. 数仓分层…...

Linux网络——自定义协议
目录 一.什么是协议 二.协议与报文 三.自定义协议 1.封装套接字 2.构建请求与响应 3.序列化和反序列化 4.报头添加和去除 5.报文读取 四.服务器端程序 五.客户端程序 一.什么是协议 协议在生活中泛指:双方或多方为了完成某项任务或达成某种目的而制定的共…...

【OpenCV实现图像:用OpenCV图像处理技巧之巧用直方图】
文章目录 概要前置条件统计数据分析直方图均衡化原理小结 概要 图像处理是计算机视觉领域中的重要组成部分,而直方图在图像处理中扮演着关键的角色。如何巧妙地运用OpenCV库中的图像处理技巧,特别是直方图相关的方法,来提高图像质量、改善细…...

【Android】画面卡顿优化列表流畅度四之Glide几个常用参数设置
好像是一年前快两年了,笔者解析过glide的源码,也是因为觉得自己熟悉一些,也就没太关注过项目里glide的具体使用对当前业务的影响;主要是自负,还有就是真没有碰到过这样的数据加载情况。暴露了经验还是不太足够 有兴趣的…...
js控制手机蓝牙
要使用JavaScript控制手机蓝牙,您需要使用Web Bluetooth API。这是一种新的Web API,可以让Web应用程序访问和控制蓝牙设备。 以下是一些步骤,以便您开始使用Web Bluetooth API: 检查浏览器支持:首先,您需要…...
C++11 原始字符串字面量R“()“
原始字符串字面量(Raw String Literals) R"()"是C11引入的一项特性,它允许创建不需要转义字符的字符串字面量。字符串中包含特殊字符、换行符和其他转义字符时,不需要反斜杠转义它们。 原始(Raw):不用使用反…...
【Vue原理解析】之虚拟DOM
Vue.js是一款流行的JavaScript框架,它采用了虚拟DOM(Virtual DOM)的概念来提高性能和开发效率。虚拟DOM是Vue.js的核心之一,它通过在内存中构建一个轻量级的DOM树来代替直接操作真实的DOM,从而减少了对真实DOM的操作次…...

HCIE-灾备技术和安全服务
灾备技术 灾备包含两个概念:容灾、备份 备份是为了保证数据的完整性,数据不丢失。全量备份、增量备份,备份数据还原。 容灾是为了保证业务的连续性,尽可能不断业务。 快照:保存的不是底层块数据,保存的是逻…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

理想汽车5月交付40856辆,同比增长16.7%
6月1日,理想汽车官方宣布,5月交付新车40856辆,同比增长16.7%。截至2025年5月31日,理想汽车历史累计交付量为1301531辆。 官方表示,理想L系列智能焕新版在5月正式发布,全系产品力有显著的提升,每…...