当前位置: 首页 > news >正文

Django路由Router

文章目录

  • 一、路由router
    • 路由匹配
    • 命名空间
    • 反向解析
  • 二、实践
    • 创建用户模型Model
    • 添加子路由 - 创建用户首页
    • 页面跳转 - 使用反向解析和命名空间
      • 1. 不使用命名空间的效果
      • 2. 使用命名空间的效果
    • 用户详情页面跳转 - 路由传参
    • 路由传递多个参数
    • re_path 以前写法,了解即可
    • 重定向Redirect
      • 1. 重定向别的地址
      • 2.重定向到自己路由(带参数)
      • 3.重定向 反向解析: 位置参数传参
      • 4. 重定向 反向解析:关键字传参


一、路由router

在实际开发过程中,一个Djaqgo 项目会包含很多的 app,这时候如果我们只在主路由里进行配置就会显得杂乱无章,所以通常会在每个app 里,创建各自的 urls.py 路由模块,然后从根路由出发,将 app 所属的 url 请求,全部转发到相应的 urls.py模块中。而这个从主路由转发到各个应用路由的过程叫做路由的分发。

路由匹配

# 使用ur1给视图函数传参数
path('index/', index)
path('detail/<int:id>/', detail)# 给ur1取别名,那么在使用此ur1的地方可以使用别名。比如:
path('index/', index, name='index')
path('detail/<int:id>/', detail, name='detail')

<int:id> 整数
<str:id> 字符串

命名空间

在实际应用中,Diango中可能存在多个应用程序,每个应用程序都可能有自己的路由模块。为了防止路由冲突,Django提供了命名空间(namespace)的概念。命名空间是一种将路由命名为层次结构的方式,使得在查询路由时可以限定在该命名空间内。

# 在根路由中可以设置命名空间path('app/', include(('App.urls',"App",namespace='App')

反向解析

Django路由反向解析是一个非常重要的功能,它可以让我们在代码中使用路由别名替代URL路径,在修改URL时避免代码中的硬编码依赖,同时也可以提高可读性和可维护性。

  • redirect 叫重定向
    • 我们在做跳转的时候,其实就是做一个页面跳转,在我们后台相当于是一个视图函数之间的跳转,从这个视图函数直接跳到另一个视图函数
  • reverse 是反向解析
    • reverse(路由name) 得到的是name所对应的路由路径 (字符串)。
    • reverse( ‘index’)   ==>   ‘index/’
    • redirect(reverse( ‘index’))   相当于==>   redirect( ‘index/’ )   也是可以跳转的。
    • args=    位置传参
    • kwargs=    关键字参数传参
# 在视图函数中,反向解析ur1:from django.shortcuts import render,redirect,reversedef buy(request):return redirect(reverse( 'index')) # 重定向return redirect(reverse( 'detail',args=[2])) # 重定向 参数传递return redirect(reverse('detail', kwargs={"id": 2})) # 重定向 关键字传参# 在templates中,使用别名{% url 'detail' stu.id %)# 使用命名空间:
# 指定命令空间后,使用反向解析时需要加上命名空间,比如:
# 1.在视图函数中:return redirect(reverse('App:index'))
# 2.在templates中:{% url 'App:index' %}{% url 'App:detail' 2 %}

如果用了命名空间,后面的反向解析(包括视图函数和模板中)都要使用命名空间

二、实践

新建一个新项目Day02MyDjangoPro01

创建用户模型Model

App\models.py

from django.db import modelsclass UserModel(models.Model):name = models.CharField(max_length=30)age = models.PositiveIntegerField()  # 非负数

生成迁移文件: python manage.py makemigrations
执行迁移: python manage.py migrate

数据库:添加几条数据
在这里插入图片描述

添加子路由 - 创建用户首页

App\urls.py

from django.urls import path
from App.views import *urlpatterns = [path('index/', index),  # 首页]

App\templates\index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body><h2>首页</h2><hr></body>
</html>

App\views.py

from django.shortcuts import renderdef index(request):return render(request, "index.html")

根路由 Day02MyDjangoPro01\urls.py

from django.contrib import admin
from django.urls import path, include# from App.views import *urlpatterns = [path('admin/', admin.site.urls),# 1. 直接使用根路由# path('user/', index),# 2.使用子路由: 使用include# path('user/', include('App.urls')),# 3.使用子路由: 使用include, 命名空间namespacepath('user/', include(('App.urls', 'App'), namespace='App')),]

http://127.0.0.1:8000/user/index/

在这里插入图片描述

页面跳转 - 使用反向解析和命名空间

App\templates\user_list.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用户列表</title>
</head>
<body><h2>用户列表</h2><hr>
</body>
</html>

App\views.py 创建视图函数user_list

from django.shortcuts import render# 首页
def index(request):return render(request, "index.html")# 用户列表
def user_list(request):return render(request, "user_list.html")

App\urls.py 写一个路由

from django.urls import path
from App.views import *urlpatterns = [path('index/', index),  # 首页path('user_list/', user_list, name='user_list')  # 用户列表
]

在这里插入图片描述

需求:在index页面跳转到user_list页面

1. 不使用命名空间的效果

根路由 Day02MyDjangoPro01\urls.py

在这里插入图片描述
App\templates\index.html

反向解析 {% url '定义路由后面name的名字' %}

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body><h2>首页</h2><hr>{#  url路由跳转  #}<a href="/user/user_list/">点击url路由的方式:进入用户列表的页面</a><br>{#  反向解析 {% url '定义路由后面name的名字' %} #}{#  user_list 是path路由的name值  #}<a href="{% url 'user_list' %}">反向解析的方式:进入用户列表的页面</a><br></body>
</html>

点击是可以跳转的

在这里插入图片描述

2. 使用命名空间的效果

根路由 Day02MyDjangoPro01\urls.py

在这里插入图片描述

App\templates\index.html

反向解析:带命名空间 {% url '命名空间的名称:定义路由后面name的名字' %}。namespace你可以理解为 一个子路由有一个命名空间。

这样做有什么用?一个命名空间表示一个应用,我们在写代码的时候,如果我们在不同应用中取相同name的话,那么可以通过应用空间namespace去区分他们。

如果是用子路由,就建议使用命名空间!!!

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body><h2>首页</h2><hr>{#  url路由跳转  #}<a href="/user/user_list/">点击url路由的方式:进入用户列表的页面</a><br>{#  反向解析 {% url '定义路由后面name的名字' %} #}{#  user_list 是path路由的name值  #}
{#    <a href="{% url 'user_list' %}">反向解析的方式:进入用户列表的页面</a>#}<br>{#  反向解析:带命名空间 {% url '命名空间的名称:定义路由后面name的名字' %} #}<a href="{% url 'App:user_list' %}">反向解析带命名空间的方式:进入用户列表的页面</a>
</body>
</html>

点击是可以跳转的

在这里插入图片描述

用户详情页面跳转 - 路由传参

App\views.py ,user_list 传参、用户详情

from django.shortcuts import render
from App.models import *# 首页
def index(request):return render(request, "index.html")# 用户列表
def user_list(request):# 获取所有用户数据users = UserModel.objects.all()return render(request, "user_list.html", {"users": users})# 用户详情
def user_detail(request, uid):# print("uid:", uid)user = UserModel.objects.get(pk=uid)  # pk:primary key主键return render(request, "user_detail.html", {'user': user})

增加一个页面,用户详情页面, App\templates\user_detail.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用户详情</title>
</head>
<body><h2>用户详情</h2><hr><p>用户的名字:{{ user.name }}</p><p>用户年龄:{{ user.age }}</p>
</body>
</html>

添加路由 App\urls.py

from django.urls import path
from App.views import *urlpatterns = [path('index/', index),  # 首页path('user_list/', user_list, name='user_list'),  # 用户列表path('userdetail/<int:uid>/', user_detail, name='userdetail'),  # 用户详情
]

App\templates\user_list.html ,将数据显示

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用户列表</title>
</head>
<body><h2>用户列表</h2><hr><ul>{% for user in users %}<li>{#     反向解析: 路由传参           #}<a href="{% url 'App:userdetail' user.id %}">{{ user.name }} - {{ user.age }}</a></li>{% endfor %}</ul></body>
</html>

在这里插入图片描述
在这里插入图片描述

路由传递多个参数

App\views.py

from django.http import HttpResponse# 多个参数
def user_ab_view(request, a, b):return HttpResponse(f'a:{a} - b:{b}')

添加路由 App\urls.py

# 多个参数
path('userab/<int:a>/<int:b>/', user_ab_view, name='user_ab'),

在这里插入图片描述

但是如果我把视图函数参数顺序反过来 会怎么样呢?

在这里插入图片描述
可以看到跟视图函数a,b顺序是没有关系的,a传给a,b传给b。

我们在用的时候,要和路由中的参数名一致,名字对应赋值,你可以理解为相当于关键字参数传值,a赋给a,b赋给b。

re_path 以前写法,了解即可

re 是正则的意思

在这里插入图片描述
第一个参数 得用正则,一般前面加一个r,字符串转义,这个跟正则没有太大关系,一般会写上r。有几个参数写上几个括号() ,整个字符串'user_ba/()/()/'会当做字符去处理的,

\d表示一个数字,\d+表示它可以是数字,表示这一块接收的是整数,+的意思就是一个整数多个整数都可以,但不能为零个整数。
a表示整数的名字,?P<a>这一串其实是给它命一个名字,给这个分组命名为a。

重定向Redirect

1. 重定向别的地址

App\views.py

from django.shortcuts import render, redirect, reverse# 重定向
def my_redirect(request):return redirect("https://blog.csdn.net/weixin_59633478/category_12401835.html")

添加路由 App\urls.py

path("myredirect/", my_redirect)

打开浏览器,输入http://127.0.0.1:8000/user/myredirect

在这里插入图片描述

注意:自动跳到了https://blog.csdn.net/weixin_59633478/category_12401835.html,地址改变了

2.重定向到自己路由(带参数)

App\views.py

def my_redirect(request):# return redirect("/user/user_list")return redirect("/user/userdetail/2/") # 带参数:第一种写法

3.重定向 反向解析: 位置参数传参

def my_redirect(request):# return redirect("/user/userdetail/2/") # 带参数:第一种写法# 反向解析return redirect(reverse("App:userdetail", args=(2,)))  # reverse("App:userdetail", args=(2,)) 相当于 '/user/userdetail/2/'

注意: 有命名空间一定要写命名空间,如果没有命名空间就不用写命名空间

# 不带命名空间
return redirect(reverse("userdetail", args=(2,)))  

4. 重定向 反向解析:关键字传参

def my_redirect(request):# 反向解析# return redirect(reverse("App:userdetail", args=(2,)))  # 反向解析: 关键字传参return redirect(reverse("App:userdetail", kwargs={'uid': 2}))

相关文章:

Django路由Router

文章目录 一、路由router路由匹配命名空间反向解析 二、实践创建用户模型Model添加子路由 - 创建用户首页页面跳转 - 使用反向解析和命名空间1. 不使用命名空间的效果2. 使用命名空间的效果 用户详情页面跳转 - 路由传参路由传递多个参数re_path 以前写法,了解即可重定向Redire…...

蜜蜂路线 P2437

蜜蜂路线 题目背景 无 题目描述 一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你&#xff1a;蜜蜂从蜂房 m 开始爬到蜂房 n&#xff0c;m<n&#xff0c;有多少种爬行路线&#xff1f;&#xff08;备注&#xff1a;题面有误&…...

无脑——010 复现yolov8 使用yolov8和rt detr 对比,并训练自己的数据集

1.配置环境 1. 首先去官网下载yolov8的zip https://github.com/ultralytics/ultralytics 存放在我的目录下G:\bsh\yolov8 然后使用conda创建新的环境 conda create -n yolov8 python3.8 #然后激活环境 conda activate yolov8然后安装pytorch&#xff0c;注意 &#xff0c;py…...

如何给Google Chrome增加proxy

1. 先打开https://github.com/KaranGauswami/socks-to-http-proxy/releases 我的电脑是Liunx系统所以下载第一个 2. 下载完之后把这个文件变成可执行文件&#xff0c;可以是用这个命令 chmod x 文件名 3. 然后执行这个命令&#xff1a; ./sthp-linux -p 8080 -s 127.0.0.1:…...

设计模式——原型模式

原型模式就是有时我们需要多个类的实例&#xff0c;但是一个个创建&#xff0c;然后初始化&#xff0c;这样太麻烦了&#xff0c;此时可以使用克隆&#xff0c;来创建出克隆对象&#xff0c;就能大大的提高效率。具体就是要让此类实现Cloneable接口&#xff0c;然后重写Object类…...

Spring框架中的Bean生命周期

目录 Bean的实例化 BeanFactoryPostProcessor 属性赋值 循环依赖 初始化 处理各种Aware接口 执行BeanPostProcessor前置处理 执行InitializingBean初始化方法或执行init-method自定义初始化方法 执行BeanPostProcessor后置处理 销毁 Spring Bean 的生命周期总体分为…...

async和await修饰符

async和await是JavaScript中用来处理异步操作的关键字 。 async和await也是解决回调地域的终极方案&#xff0c;简单&#xff0c;而Promise链混杂难以看懂。 async关键字用于定义一个函数&#xff0c;使其返回一个Promise对象。这意味着该函数可以通过await关键字来暂停执行&…...

vivado tcl创建工程和Git管理

一、Tcl工程创建 二、Git版本管理 对于创建完成的工程需要Git备份时&#xff0c;不需要上传完整几百或上G的工程&#xff0c;使用tcl指令创建脚本&#xff0c;并只将Tcl脚本上传&#xff0c;克隆时&#xff0c;只需要克隆tcl脚本&#xff0c;使用vivado导入新建工程即可。 优…...

田间农业数字管理系统-高标准农田建设

政策背景 2019年11月&#xff0c;国务院办公厅印发的《国务院办公厅关于切实加强高标准农田建设提升粮食安全保障能力的意见》明确提出&#xff0c;到2022年&#xff0c;全国要建成10亿亩高标准农田。 2021年9月16日&#xff0c;由农业农村部印发的《全国高标准农田建设规划&a…...

【网络安全】等保测评系列预热

【网络安全】等保测评系列预热 前言1. 什么是等级保护&#xff1f;2. 为什么要做等保&#xff1f;3. 路人甲疑问&#xff1f; 一、等保测试1. 渗透测试流程1.1 明确目标1.2 信息搜集1.3 漏洞探索1.4 漏洞验证1.5 信息分析1.6 获取所需1.7 信息整理1.8 形成报告 2. 等保概述2.1 …...

解决: git拉取报错 git 未能顺利结束 (退出码 1)

拉取代码失败信息 解决方法: 执行一下"git push -f origin master"命令即可 步骤: 1.项目文件夹右击选择"Git Bash Here",打开命令窗口 2. 输入"git push -f origin master"后,回画 执行结束 3.再拉取代码,成功...

【深度学习中的批量归一化BN和层归一化LN】BN层(Batch Normalization)和LN层(Layer Normalization)的区别

文章目录 1、概述2、BN层3、LN层4、Pytorch的实现5、BN层和LN层的对比 1、概述 归一化(Normalization) 方法&#xff1a;指的是把不同维度的特征&#xff08;例如序列特征或者图像的特征图等&#xff09;转换为相同或相似的尺度范围内的方法&#xff0c;比如把数据特征映射到[…...

开发一个RISC-V上的操作系统(六)—— 中断(interrupt)和异常(exception)

目录 往期文章传送门 一、控制流 &#xff08;Control Flow&#xff09;和 Trap 二、Exceptions, Traps, and Interrupts Contained Trap Requested Trap Invisible Trap Fatal Trap 异常和中断的异同 三、RISC-V的异常处理 mtvec&#xff08;Machine Trap-Vector Ba…...

心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102)

文章目录 前言介绍系统框架原项目地址本项目开发开源地址硬件PCB软件功能 详细内容硬件外壳制作WS2812级联及控制MAX30102血氧传感器0.96OLEDFreeRTOS 效果视频总结 前言 在好几年前&#xff0c;我好像就看到了焊武帝 jiripraus在纪念结婚五周年时&#xff0c;制作的一个心跳跟…...

5. 服务发现

当主机较少时&#xff0c;在抓取配置中手动列出它们的IP地址和端口是常见的做法&#xff0c;但不适用于较大规模的集群。尤其不适用使用容器和基于云的实例的动态集群&#xff0c;这些实例经常会变化、创建或销毁的情况。 Prometheus通过使用服务发现解决了这个问题&#xff1…...

算法备案背后的原因:确保技术透明度与公正

随着现代技术的发展&#xff0c;算法逐渐渗透到我们日常生活的各个方面&#xff0c;从金融决策到个性化的商品推荐&#xff0c;再到医疗诊断和司法系统。然而&#xff0c;这种无所不在的应用也带来了一系列的社会和伦理问题&#xff0c;尤其是在算法的透明度和公正性上。这正是…...

Linux centos 常用命令 【持续更新】

一、查看文件信息 indoe和目录项 # df命令查看每个硬盘分区的inode总数和已经使用的数量 df -i# 查看inode的大学 xfs_growfs /dev/sda1|grep "isize"# 查看文件的indoe号码 ls -istat查看文件信息 # 文件的详细信息 stat anaconda-ks.cfg # -t参数是在一行内输出…...

《使用 VMware 在 Windows 上搭建 Linux 系统的完整指南》

《使用 VMware 在 Windows 上搭建 Linux 系统的完整指南》 1、准备工作1.1 安装 VMware 软件1.2 下载 Linux 发行版镜像文件1.3 安装SSH工具 2、创建新的虚拟机2.1 VMware页面2.2 打开VMware页面并点击创建新的虚拟机&#xff0c;选择自定义2.3 选择系统兼容性&#xff0c;默认…...

大数据Flink(六十):Flink 数据流和分层 API介绍

文章目录 Flink 数据流和分层 API介绍 一、​​​​​​​​​​​​​​Flink 数据流...

软件测试面试题——如何测试App性能?

为什么要做App性能测试&#xff1f; 如果APP总是出现卡顿或网络延迟的情况&#xff0c;降低了用户的好感&#xff0c;用户可能会抛弃该App&#xff0c;换同类型的其他应用。如果APP的性能较好&#xff0c;用户体验高&#xff0c;使用起来丝滑顺畅&#xff0c;那该应用的用户粘…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

土建施工员考试:建筑施工技术重点知识有哪些?

《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目&#xff0c;核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容&#xff0c;附学习方向和应试技巧&#xff1a; 一、施工组织与进度管理 核心目标&#xff1a; 规…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…...

智能体革命:企业如何构建自主决策的AI代理?

OpenAI智能代理构建实用指南详解 随着大型语言模型&#xff08;LLM&#xff09;在推理、多模态理解和工具调用能力上的进步&#xff0c;智能代理&#xff08;Agents&#xff09;成为自动化领域的新突破。与传统软件仅帮助用户自动化流程不同&#xff0c;智能代理能够自主执行工…...

[C++错误经验]case语句跳过变量初始化

标题&#xff1a;[C错误经验]case语句跳过变量初始化 水墨不写bug 文章目录 一、错误信息复现二、错误分析三、解决方法 一、错误信息复现 write.cc:80:14: error: jump to case label80 | case 2:| ^ write.cc:76:20: note: crosses initialization…...

RK3568项目(七)--uboot系统之外设与PMIC详解

目录 一、引言 二、按键 ------>2.1、按键种类 ------------>2.1.1、RESET ------------>2.1.2、UPDATE ------------>2.1.3、PWRON 部分 ------------>2.1.4、RK809 PMIC ------------>2.1.5、ADC按键 ------------>2.1.6、ADC按键驱动 ------…...

【Unity】R3 CSharp 响应式编程 - 使用篇(二)

一、通用的事件监听用法 using System;using R3;using UnityEngine;namespace Aladdin.Standard.Observable.Common{public class CommonObservable : MonoBehaviour{// 默认会调用1次public SerializableReactiveProperty<int> serializableReactiveProperty;…...