探索Django路由规则(路由匹配、路由命名空间、HTML中的跳转与Django集成、路由传参以及后端重定向)

news2024/11/14 15:29:16

路由管理:

​ 在实际开发过程中,⼀个Django 项⽬会包含很多的 app ,这时候如果我们只在主路由⾥进⾏配置就会显得杂乱⽆章,所以通常会在每个 app ⾥,创建各⾃的 urls.py 路由模块,然后从根路由出发,将 app 所属的 url 请求,全部转发到相应的 urls.py 模块中。⽽这个从主路由转发到各个应⽤路由的过程叫做路由的分发。

在这里插入图片描述

注册app:

在这里插入图片描述

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [BASE_DIR / 'templates',] # 可以多个
        ,
        "APP_DIRS": True,
        "OPTIONS": {
            "context_processors": [
                "django.template.context_processors.debug",
                "django.template.context_processors.request",
                "django.contrib.auth.context_processors.auth",
                "django.contrib.messages.context_processors.messages",
            ],
        },
    },
]

路由匹配:
# 使⽤url给视图函数传参数 
path('index/', index) 
path('detail/<int:id>/', detail)

# 给url取别名,那么在使⽤此url的地⽅可以使⽤别名。⽐如:
path('index/', index, name='index')
path('detail/<int:id>/', detail, name='detail')
命名空间:

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

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

{#      url路由  #}

{#    路径是相对于 http://127.0.0.1:8000  注意跳转的/必须要加 的#}

    <a href="/user/userlist/">url路由的方式:进入用户列表页面</a>
    <hr>

{#      反向解析#}
{#     userlist 是path路由的name值#}
{#    <a href="{% url 'userlist' %}">反向解析的方式:进入用户列表页面</a>#}
{#    <hr>#}



{#     反向解析:带命名空间#}
{#    一个子路由有一个命名空间,然后去子路由去找名称为userlist的映射#}
    <a href="{% url 'App:userlist' %}">反向解析带命名空间的方式:进入用户列表页面</a>


</body>
</html>

在这里插入图片描述

在这里插入图片描述

正向解析: 先有访问url地址,后进行路由映射,然后到html

反向解析:先匹配路由名称,然后定位路由路径,进行路由函数映射

注意:反向解析和命名空间的写法只能保留一种。

{% url 'detail' stu.id %}
{% url 'App:index' %}
<a href="{% url 'App:userdetail' user.id %}">
路由传参:
from django.urls import path, re_path
from App.views import *

urlpatterns = [
    # 首页
    path('index/', index),
    # 用户列表
    path('userlist/', user_list, name='userlist'),

    # 用户详情
    path('userdetail/<int:uid>/', user_detail, name='userdetail'),

    # 多个参数
    path('userab/<int:a>/<int:b>/', user_ab_view, name='userab'),
    # <int:a> 整数
    # <str:a> 字符串

    path('userba/<int:a>/<int:b>/', user_ba_view, name='userba'),
    # 正则的写法: 以前的写法
    # re_path(r'userba/(?P<a>\d+)/(?P<b>\d+)/', user_ba_view, name='userba'),



]


from django.http import HttpResponse
from django.shortcuts import render, redirect, reverse
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})


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

# 要和路由中的参数名一致,名字对应赋值
def user_ba_view(request, b, a):
    return HttpResponse(f'a:{a} - b:{b}')


<!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为命名空间的名字,userdetail是自己设置的路由名称,{% url 'App:userdetail' user.id %},user.id会作为参数传递个userdetail这个路由名称所对应的路由。


views.py

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

# 要和路由中的参数名一致,名字对应赋值
def user_ba_view(request, b, a):
    return HttpResponse(f'a:{a} - b:{b}')

urls.py

    # 多个参数  相当于关键字参数
    path('userab/<int:a>/<int:b>/', user_ab_view, name='userab'),
    # <int:a> 整数
    # <str:a> 字符串

    path('userba/<int:a>/<int:b>/', user_ba_view, name='userba'),

我们看看多个参数怎么传递呢?

在这里插入图片描述

但是这种路由的写法是django比较新的写法,下面是比较老的写法,使用正则表达式来进行约束。

# 正则的写法: 以前的写法
re_path(r'userba/(?P<a>\d+)/(?P<b>\d+)/', user_ba_view, name='userba'),

后端重定向:

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

views.py

from django.http import HttpResponse
from django.shortcuts import render, redirect, reverse
from App.models import *


# 重定向
def my_redirect(request):
    # 反向解析url :会先去找reverse('xx')中的名字,就是路由函数
    # return redirect(reverse('index'))
	# return redirect(reverse('detail', args=[2]))
	# return redirect(reverse('detail', kwargs={"id": 2})
       
     # /a/b 是绝对路径,相当于在端口下拼接   
    # return redirect('https://www.ifeng.com')
    # return redirect('/user/userlist/')
    # return redirect('/user/userdetail/2/')

    # 反向解析 对应命名空间下的路由名
    # reverse('App:userdetail', args=(1,)) => 'userdetail/1/'
    # 带命名空间的写法
    # return redirect(reverse('App:userdetail', args=(1,)))  # 位置参数传参
    return redirect(reverse('App:userdetail', kwargs={'uid': 2}))  # 关键字传参
    # 不带命名空间
    # return redirect(reverse('userdetail', args=(1,)))  # 位置参数传参



urls.py

    # 重定向
    path('myredirect/', my_redirect),

注意:有namespace则在后面的html或者重定向或者反向解析都要使用命名空间来写,不然找不到。如果用了命名空间,后面的反向解析(包括视图函数和模板中)都要使用命名空间。

技巧:

在flask或者django中,都是使用模板语言,可以巧用tab提高编程速度。

在这里插入图片描述

在这里插入图片描述

如果没有提示需要修改配置文件:

在这里插入图片描述

总结:

本文深入剖析了Django框架中与路由相关的知识点,包括路由匹配、路由命名空间、HTML中的跳转与Django集成、路由传参以及后端重定向。这些概念和技巧是构建出高效、可扩展Web应用程序的关键要素。

通过全面理解路由匹配机制,我们能够根据URL模式将请求准确地分发到对应的视图函数,实现灵活的路由控制。同时,通过合理使用路由命名空间,我们能够更好地组织和管理路由,提高项目的可维护性和可扩展性。

在前端方面,我们介绍了如何将HTML中的跳转与Django集成,利用模板语言和URL反解析功能,轻松实现页面间的无缝跳转。而通过路由传参,我们可以在URL中传递参数,为视图函数提供所需的数据,实现个性化的页面渲染和处理。

另外,后端重定向是处理用户请求的常见技术之一。通过后端重定向,我们可以根据特定条件将用户重定向到其他URL,实现页面跳转和流程控制,从而提升用户体验和应用程序的功能性。

通过掌握Django路由解析与跳转的全面知识,我们能够构建出强大而稳健的Web应用程序。希望本文能够为你提供深入学习和实践的指导,助你在Django开发中更加熟练和自信。继续探索和应用这些技术,相信你将在Web开发的道路上取得更大的成就。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode日记(32)字符串相乘

做了很久很久……真的太繁琐了&#xff01;&#xff01; class Solution { public:string multiply(string num1, string num2) {string s;string str;if (num1 "0" || num2 "0") return "0";for(int inum2.size()-1;i>0;i--){int c2num2[…

代码随想录算法训练营第三十八天|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯。

509. 斐波那契数 题目链接&#xff1a;斐波那契数 题目描述&#xff1a; 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c…

2024 高级前端面试题之 计算机通识(基础) 「精选篇」

该内容主要整理关于 计算机通识&#xff08;基础&#xff09; 的相关面试题&#xff0c;其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 计算机基础精选篇 一、网络1.1 UDP1.2 TCP1.3 HTTP1.4 DNS 二、数据结构2.1 栈2.2 队列2.3 链表2.4 树2.5 堆 三、算法3.1 时…

阿里云配置服务器详细指南_2024年CPU内存带宽配置选择

阿里云服务器配置怎么选择&#xff1f;根据实际使用场景选择&#xff0c;个人搭建网站可选2核2G配置&#xff0c;访问量大的话可以选择2核4G配置&#xff0c;企业部署Java、Python等开发环境可以选择2核8G配置&#xff0c;企业数据库、Web应用或APP可以选择4核8G配置或4核16G配…

Sora热潮 | 暴雨AI服务器助推大模型向前发展

Sora全球爆火这事还有谁不知道吗&#xff1f; 2月16日&#xff0c; OpenAI发布了一条由视频大模型Sora所自动生成的视频&#xff0c;逼真的视觉效果让其在一夜之间“刷屏”。 一石激起千层浪&#xff0c;Sora的发布让科技从业者&#xff0c;投资圈、影视行业纷纷“炸锅“&…

【双指针】:LCR179.查找总价值为目标值的两个商品

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本专栏是关于各种算法的解析&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结构专栏&…

数据结构D3作业

1. 2. 按位插入 void insert_pos(seq_p L,datatype num,int pos) { if(LNULL) { printf("入参为空&#xff0c;请检查\n"); return; } if(seq_full(L)1) { printf("表已满&#xff0c;不能插入\n"); …

Spring 类型转换、数值绑定与验证(二)—PropertyEditor与Conversion

Spring 中&#xff0c;属性类型转换是在将数值绑定到目标对象时完成的。例如在创建ApplicationContext 容器时&#xff0c;将XML配置的bean 转换成Java类型对象&#xff0c;主要是借助了PropertyEditor类&#xff0c;而在Spring MVC 的Controller的请求参数转化为特定类型时&am…

为M系Mac安装Centos

下载镜像 需要使用特殊镜像&#xff0c;官网或国内的arch 镜像源不可安装 https://share.weiyun.com/2qc0S2VV CentOS-7-aarch64-08191738.mpg https://www.aliyundrive.com/s/1DCW2E5EySR 原文链接&#xff1a;https://blog.csdn.net/acdemic964850/article/details/1290565…

ROS问题记录

目前遇到的问题&#xff1a; 1 、包名大写会警告 包名不要出现大写 2、catkin_make前配置环境变量 尤其在更换终端时&#xff0c;一定要再配置一遍环境变量&#xff0c;常见的错误如下 基本上这个错误都是因为没有执行以下命令 source ~/catkinws/devel/setup.bash3、调用…

ABAP 某些列无法正常筛选

某些列无法正常筛选 如果无法筛选&#xff0c;要注意前导0是否添加&#xff0c;数据库是没有前导0&#xff0c;但是一旦筛选&#xff0c;就是自动加上前导0去筛选&#xff0c;所以筛选不到数据

【JVM】五种对象引用

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;JVM ⛺️稳中求进&#xff0c;晒太阳 几种常见的对象引用 可达性算法中描述的对象引用&#xff0c;一般指的是强引用&#xff0c;即是GCRoot对象对普通对象有引用关系&#xff0c;只要这层…

用 Python 自动化处理无聊的事情

“编程最棒的部分就是看到机器做一些有用的事情而获得的胜利。用 Python 将无聊的事情自动化将所有编程视为这些小小的胜利&#xff1b;它让无聊变得有趣。” Hilary Mason&#xff0c;数据科学家兼 Fast Forward Labs 创始人 “我很享受打破东西然后把它们重新组合起来的乐趣…

软件常见设计模式

设计模式 设计模式是为了解决在软件开发过程中遇到的某些问题而形成的思想。同一场景有多种设计模式可以应用&#xff0c;不同的模式有各自的优缺点&#xff0c;开发者可以基于自身需求选择合适的设计模式&#xff0c;去解决相应的工程难题。 良好的软件设计和架构&#xff0…

不要抱怨,不如抱 Java 运算符吧 (1)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

LLMChain使用 | RouterChain的使用 - 用本地大模型搭建多Agents

单个本地大模型搭建参考博客 单个Chain&#xff1a;面对一个需求&#xff0c;我们需要创建一个llmchain&#xff0c;设置一个prompt模板&#xff0c;这个chain能够接收一个用户input&#xff0c;并输出一个结果&#xff1b;多个Chain&#xff1a;考虑到同时面对多个需求&#x…

十六、多边形填充和绘制

项目功能实现&#xff1a;对多边形进行轮廓绘制和填充 按照之前的博文结构来&#xff0c;这里就不在赘述了 一、头文件 mult-drawing.h #pragma once#include<opencv2/opencv.hpp>using namespace cv;class Mult_Drawing { public:void mult_drawing(); };#pragma onc…

Employee Management系统存在Sql注入 附源代码

免责声明&#xff1a;本文所涉及的信息安全技术知识仅供参考和学习之用&#xff0c;并不构成任何明示或暗示的保证。读者在使用本文提供的信息时&#xff0c;应自行判断其适用性&#xff0c;并承担由此产生的一切风险和责任。本文作者对于读者基于本文内容所做出的任何行为或决…

C++日志库plog使用指南

前言 之前介绍过一个C语言日志库 轻量级c语言开源日志库log.c介绍&#xff0c;源代码只有不到200行&#xff0c;使用非常方便。但是也存在很多缺点&#xff0c;比如日志时间只支持打印到秒&#xff0c;没有作多线程处理&#xff0c;不支持日志回滚。在小型项目或者测试demo中使…

如何将cocos2d-x js打包部署到ios上 Mac M1系统

项目环境 cocos2d-x 3.13 xcode 12 mac m1 big sur 先找到你的项目 使用xcode软件打开上面这个文件 打开后应该是这个样子 执行编译运行就好了 可能会碰到的错误 在xcode11版本以上都会有这个错误&#xff0c;这是因为iOS11废弃了system。 将上面代码修改为 #if (CC_TARGE…