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}))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/85937.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker实现Nginx

文章目录 1.docker 安装2.docker环境实现Nginx 1.docker 安装 1.使用环境为红帽8.1,添加源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo2.安装 yum install docker-ce docker-ce-cli containerd.io显示出错 Docker C…

git和github学习

一、什么是git和github? 二、学会使用github desktop应用程序 初始使用&#xff1a; 一开始我们是新账户&#xff0c;里面是没有仓库的&#xff0c;需要手动创建一个仓库。此时&#xff0c;这个仓库是创建在本地仓库里面&#xff0c;需要用到push命令&#xff08;就是那个pub…

图像的缩放之c++实现(qt + 不调包)

1.基本原理 图像的缩放一般使用插值算法&#xff0c;而本章将介绍两种常用插值算法&#xff1a;最临近插值法和双线性插值法 1.最临近插值法 将浮点数的位置坐标&#xff0c;进行四舍五入找到原图像的整型坐标即可&#xff0c;具体操作可见下面的公式&#xff0c;其中原图像坐标…

(docker)mysql镜像拉取-创建容器-容器的使用【个人笔记】

【容器的第一次创建】 容器的第一次创建&#xff0c;需要先下载镜像&#xff0c;从 镜像拉取 0、可以搜索镜像的版本 docker search mysql1、先拉取MySQL的镜像&#xff0c;默认拉取最新版&#xff0c;使用下面的命令拉取mysql镜像 docker pull mysql也可以指定mysql的版本…

如何快速解决集成环信IM遇到的问题?

1、环信FAQ频道发布了 环信FAQ帮助中心提供了各客户端、RESTful API、环信控制台以及商务相关的集成环信常见问题及解决方法&#xff0c;帮您快速解决集成问题 2、当我有问题时&#xff0c;从哪里进FAQ&#xff1f; 干脆收藏这个网址&#xff1a;https://faq.easemob.com/ 环…

iptables端口转发,wireshark抓包分析

app发送请求&#xff0c;到安全交互平台访问服务&#xff0c;app发送请求的ip地址是基站随机分配的&#xff0c;ip地址被拉黑了怎么访问&#xff1f;解决办法&#xff1f; 一开始考虑使用nginx作为代理服务器转发请求&#xff0c;后来在服务器用端口转发解决。 修改nginx配置文…

Flutter游戏引擎Flame系列笔记 - 1.Flame引擎概述

Flutter游戏引擎Flame系列笔记 1.Flame引擎概述 - 文章信息 - Author: 李俊才(jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/132119035 【介绍】…

Unity 3D中使用tilemap创建关卡地图,瓦片间隙有漏缝

我们使用一张图片来作为Sprite图集&#xff0c;创建地形图&#xff1a; 运行后&#xff0c;会发现&#xff0c;瓦片之间似乎总是有间距。 检查了图片发现&#xff0c;并不是图片边界存在间隙。 最后发现问题是出在图片资源中的线性过滤属性值&#xff1a; 在设计界面就能够看…

SpringBoot运行流程源码分析------阶段二(run方法核心流程)

run方法核心流程 在分析和学习整个run方法之前&#xff0c;我们可以通过以下流程图来看下SpringApplication调用的run方法处理的核心操作包含哪些。 从上面的流程图中可以看出&#xff0c;SpringApplication在run方法中重点做了以下几步操作 获取监听器和参数配置打印banner…

Cloud Studio实战——热门视频Top100爬虫应用开发

最近Cloud Studio非常火&#xff0c;我也去试了一下&#xff0c;感觉真的非常方便&#xff01;我就以Python爬取B站各区排名前一百的视频&#xff0c;并作可视化来给大家分享一下Cloud Studio&#xff01;应用链接&#xff1a;Cloud Studio实战——B站热门视频Top100爬虫应用开…

【数学】CF1514 C

Problem - 1514C - Codeforces 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>using i64 long long;constexpr int N 2e5 10; constexpr int M 2e5 10; constexpr int mod 998244353;void solve() {int n;std::cin >> n;std:…

lscpu的各个参数是什么意思?

$ lscpu Architecture: x86_64 #架构 CPU op-mode(s): 32-bit, 64-bit #运行方式 Byte Order: Little Endian #字节顺序 CPU(s): 96 #逻辑cpu数 On-line CPU(s) list: 0-95 #在线cpu Thread(s) per core: 2 #每个核包含线程…

HarmonyOS SDK开放能力,服务鸿蒙生态建设,打造优质应用体验

华为开发者大会2023&#xff08;HDC.Together&#xff09;于8月4日至6日在东莞松山湖举行&#xff0c;在HarmonyOS端云开放能力技术分论坛上&#xff0c;华为为广大开发者们介绍了HarmonyOS SDK开放能力在基础开发架构、功能特性等方面的变化之处&#xff0c;通过将常见的通用能…

LeetCode 1572. 矩阵对角线元素的和

【LetMeFly】1572.矩阵对角线元素的和 力扣题目链接&#xff1a;https://leetcode.cn/problems/matrix-diagonal-sum/ 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&…

一个简单实用的线程池及线程池组的实现!

1.线程池简介 线程池&#xff0c;顾名思义&#xff0c;就是一个“池子”里面放有多个线程。为什么要使用线程池呢&#xff1f;当我们编写的代码需要并发异步处理很多任务时候&#xff0c;一般的处理办法是一个任务开启一个线程去处理&#xff0c;处理结束后释放线程。可是这样…

第四十八周周报

学习目标&#xff1a; 修改ViTGAN 学习内容&#xff1a; 位置编码和多尺度 学习时间&#xff1a; 8.5-8。12 学习产出&#xff1a; 这两周主要工作在修改ViTGAN的结构和代码&#xff0c;将相对位置编码加入ViTGAN并将生成器变为多尺度&#xff0c;由于匹配维度很困难&am…

maven的入门使用

maven的入门使用 1.Maven&#xff08;Maven Apache&#xff09;是一个流行的项目构建和管理工具&#xff0c;2.项目结构和POM文件&#xff1a;3.POM文件&#xff08;Project Object Model&#xff09;4.依赖管理&#xff1a; 在POM文件中5.生命周期和构建过程1.前言2.插件系统3…

Windows 编译CEF源码详细记录

背景 默认的CEF不支持音视频功能&#xff0c;需要下载源码将ffmpeg开关打开&#xff0c;再进行编译。 Linux编译参考&#xff1a; 《Linux CEF源码下载编译详细记录》 创建目录结构 code/automate/automate-git.py <-- CEF build scriptchromium_git/cef/ …

湘大 XTU OJ 1148 三角形 题解(非常详细):根据题意朴素模拟+观察样例分析需要计算几轮 具体到一般

一、链接 1148 三角形 二、题目 题目描述 给一个序列&#xff0c;按下面的方式进行三角形累加&#xff0c;求其和值。 比如序列为 1,2,3,4,5 1 2 3 4 53 5 7 98 12 1620 2848输入 有多组样例。每个样例的第一行是一个整数N(1≤N≤100),表示序列的大小&…

27.Netty源码之FastThreadLocal

highlight: arduino-light FastThreadLocal FastThreadLocal 的实现与 ThreadLocal 非常类似&#xff0c;Netty 为 FastThreadLocal 量身打造了 FastThreadLocalThread 和 InternalThreadLocalMap 两个重要的类。下面我们看下这两个类是如何实现的。 FastThreadLocalThread 是对…