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

django的路由分发

前言:

在前面我们已经学习了基础的Django了,今天我们将继续学习,我们今天学习的是路由分发:

路由分发是Web框架中的一个核心概念,它指的是将不同的URL请求映射到对应的处理函数(视图)的过程。在Django这样的Web框架中,路由分发是通过URL配置(通常在urls.py文件中定义)来实现的。

1.什么是路由分发?

  1. 定义URL模式:在Django中,路由分发通常通过定义一系列的URL模式来实现。这些模式指定了URL的结构,以及当这些URL被访问时应该调用哪个视图函数。

  2. 映射到视图:每个URL模式都与一个视图函数或类关联。当一个请求的URL与某个模式匹配时,Django就会调用与之关联的视图函数来处理请求。

  3. 分发请求:路由分发的目的是将用户的请求分发到正确的视图函数。这个过程是动态的,根据请求的URL来决定。

  4. 组织URL:路由分发有助于组织项目的URL结构,使其清晰和易于维护。通过将URL映射到视图,开发者可以构建出逻辑清晰的Web应用程序。

2.Django中的路由分发

在Django中,路由分发是通过以下步骤实现的:

  1. 根URL配置:在项目的根目录下,通常会有一个urls.py文件,它包含了项目的主路由配置。

  2. 包含应用路由:在根urls.py文件中,可以使用include()函数将请求分发到不同的应用。这允许每个应用有自己的路由配置,使得项目结构更加模块化。

  3. 应用URL配置:每个应用可以有自己的urls.py文件,用于定义该应用的路由规则。

  4. 正则表达式和路径表达式:Django允许使用正则表达式(通过re_path()函数)或路径表达式(通过path()函数)来定义URL模式。

  5. 命名路由:路由可以被命名,这样可以在模板和视图中方便地引用它们。

  6. 重定向:路由分发也可以用来实现URL的重定向。

2.1应用级别的路由配置

每个Django应用下都可以有一个urls.py文件,这个文件用于定义该应用的路由配置。

# UrlApp/urls.py
from django.urls import path
from . import viewsurlpatterns = [path('index/', views.index),
]

在这个例子中,UrlApp是一个应用的名称,views是该应用中定义视图的模块。urlpatterns是一个列表,包含了该应用的所有路由规则。每个路由规则使用path()函数定义,它接受一个URL模式和一个视图函数。

2.2项目的路由分发

在项目的根目录urls.py文件中,你可以将请求分发到不同的应用。这是通过使用include()函数实现的。

# 项目的根目录 urls.py
from django.urls import path, includeurlpatterns = [path('urlapp/', include('UrlApp.urls')),path('urlapp2/', include('UrlApp2.urls')),
]

这里的include()函数用于包含另一个URL配置模块。当Django处理请求时,它会查看根urls.py中的urlpatterns列表。如果找到匹配的路由,它会将请求进一步分发到指定的应用路由配置中。

  • path('urlapp/', include('UrlApp.urls')):这行代码定义了一个路由规则,当用户访问/urlapp/时,Django会查找UrlApp应用下的urls.py文件,并使用该文件中的urlpatterns来进一步处理请求。

  • path('urlapp2/', include('UrlApp2.urls')):同样,这行代码为UrlApp2应用定义了一个路由前缀/urlapp2/。所有以这个前缀开头的URL都会交给UrlApp2应用的urls.py文件来处理。

2.3使用正则表达式匹配路由

Django的re_path()函数允许使用正则表达式来匹配URL模式。

# 使用正则表达式匹配路由
from django.urls import re_path
from django.http import HttpResponse
from myapp import viewsurlpatterns = [re_path(r'^[A-Za-z]+/$', views.re_view),
]def re_view(request):return HttpResponse('这个视图的路由是英文字母响应')

在这个例子中,正则表达式r'^[A-Za-z]+/$'匹配任何以一个或多个英文字母开头和结尾的URL。匹配到的字母部分会传递给re_view视图函数。这个是正则表达式的通用表示。

2.4 URL参数传递

Django的path()函数允许在URL中定义参数,并将其传递给视图函数。

# URL参数传递
from django.urls import pathurlpatterns = [path('demo/<urldata>/', views.get_url_data),
]def get_url_data(request, urldata):return HttpResponse(f'从 URL 中获取到的参数为:{urldata}')

在这个例子中,<urldata>是一个动态路径参数,它会被替换为实际的URL部分,并作为参数传递给get_url_data视图函数。

2.5 在URL映射中携带附加数据

path()re_path()函数可以接受一个字典作为第三个参数,这个字典会被作为附加数据传递给视图函数。

urlpatterns = [path('extra/', views.extra, {'age': 28}),
]def extra(request, age):return HttpResponse(f'从 url 映射方法中获取到的附加数据为:{age}')

在这个例子中,字典{'age': 28}会被传递给extra视图函数。

2.6 默认参数

视图函数可以接受默认参数值,如果URL中没有提供相应的参数,将使用默认值。

urlpatterns = [path('default/', views.default_data),path('default/<data>/', views.default_data),
]def default_data(request, data=369):return HttpResponse(f'从 URL 中获取到的参数为:{data}')

 在这个例子中,如果URL中没有提供data参数,视图函数将使用默认值369

2.7.路由转换器

Django提供了一些内置的路由转换器,用于将URL参数转换为特定的数据类型。

urlpatterns = [path('int/<int:data>/', views.int_view),path('str/<str:data>/', views.str_view),path('path/<path:data>/', views.path_view),path('slug/<slug:data>/', views.slug_view),path('uuid/<uuid:data>/', views.uuid_view),
]def int_view(request, data):return HttpResponse(f'使用 int 转换器,接收到的数据为:{data}')def str_view(request, data):return HttpResponse(f'使用 str 转换器,接收到的数据为:{data}')def path_view(request, data):return HttpResponse(f'使用 path 转换器,接收到的数据为:{data}')def slug_view(request, data):return HttpResponse(f'使用 slug 转换器,接收到的数据为:{data}')def uuid_view(request, data):return HttpResponse(f'使用 uuid 转换器,接收到的数据为:{data}')
  • int:匹配正整数,并将参数转换为整数类型。
  • str:匹配非空字符串。
  • path:匹配任意非空字符串,包括斜杠。
  • slug:匹配字母、数字、下划线和横线。
  • uuid:匹配通用唯一标识符(UUID)。

3.反向解析路由:

反向解析路由是Django中一个非常有用的功能,它允许你通过视图函数名(即URL的模式名称)来动态构建URL,而不是直接硬编码URL字符串。这种方式提高了代码的可维护性和灵活性,尤其是当你需要更改URL结构时,你只需要修改urls.py文件中的路径,而不需要在整个项目中搜索和替换硬编码的URL。

在Django中,反向解析路由是一种动态获取URL的方式,它允许你在模板和视图中使用人可读的名称来引用URL,而不是硬编码的路径。这种方式提高了代码的可维护性和可读性。

3.1在HTML模板中反向解析路由

在模板中,可以使用{% url 'URL的模式名称' 参数 %}来反向解析路由。

<body>反向解析路由<br><a href="{% url 'num' %}">点击开奖</a><br><a href="{% url 'age' 28 %}">不要点击</a><br>
</body>

这里,'num''age'是URL的模式名称,它们对应于视图的URL配置。

3.2在视图中反向解析路由

在视图中,可以使用reverse('URL的模式名称')来获取URL。

from django.urls import reverse
from django.http import HttpResponse
from django.shortcuts import redirectdef text(request):return HttpResponse(f'视图解析路由:{reverse("num")}')def redirect_reverse(request):return redirect(reverse("num"))def text_data(request, data):return HttpResponse(f'视图解析路由:{reverse("age", args=[data])}')

reverse函数接受URL的模式名称和一个可选的参数列表或关键字参数字典,返回对应的URL。

3.3URL的模式名称

urls.py中,通过给path函数的name参数赋值,可以为URL定义一个模式名称。

from django.urls import path
from . import viewsurlpatterns = [path('index/', views.index),path('html/', views.html_view),path('number/', views.number, name='num'),path('age/<data>/', views.data_view, name='age'),
]

3.4.URL的应用名称空间

在大型项目中,不同的应用可能有不同的URL配置,为了避免URL模式名称的冲突,Django允许为每个应用定义一个名称空间。

3.5定义应用名称空间

在应用的urls.py文件中,可以定义一个app_name属性来设置应用的名称空间。

app_name = 'urlapp2'

3.6在模板中使用应用名称空间

在模板中反向解析属于特定应用名称空间的URL时,需要指定应用名称空间和URL的模式名称。

<body><a href="{% url 'urlapp2:num' %}">点击开奖</a><br><a href="{% url 'urlapp2:age' 28 %}">不要点击</a><br>
</body>

在这里,'urlapp2'是应用的名称空间,'num''age'是URL的模式名称。

3.7在视图中使用应用名称空间

在视图中,也需要使用带有应用名称空间的URL模式名称来反向解析URL。

def text(request):return HttpResponse(f'视图解析路由:{reverse("urlapp2:num")}')def redirect_reverse(request):return redirect(reverse("urlapp2:num"))def text_data(request, data):return HttpResponse(f'视图解析路由:{reverse("urlapp2:age", args=[data])}')

反向解析路由是Django中一个强大的功能,它允许你动态地构建URL,而不是硬编码。通过定义URL的模式名称和应用名称空间,你可以避免URL的冲突,并使你的代码更加清晰和易于维护。

结语:

今天关于Django的路由分发的部分就先分享到这里了,关于这个路由分发在整个的Django框架里面是非常重要的,因为是通过路由分发可以提高你的代码的灵活性和可维护性,不过由于小编的水平有限,这些关于路由分发的内容难免会有所遗漏,希望大家可以多多支持一下,也欢迎大佬的斧正,小编都会虚心接受的。今天的分享就先到这里了,大家下次再见!

相关文章:

django的路由分发

前言&#xff1a; 在前面我们已经学习了基础的Django了&#xff0c;今天我们将继续学习&#xff0c;我们今天学习的是路由分发&#xff1a; 路由分发是Web框架中的一个核心概念&#xff0c;它指的是将不同的URL请求映射到对应的处理函数&#xff08;视图&#xff09;的过程。…...

《贪吃蛇小游戏 1.0》源码

好久不见&#xff01; 终于搞好了简易版贪吃蛇小游戏&#xff08;C语言版&#xff09;&#xff0c;邀请你来玩一下~ 目录 Snake.h Snake.c test.c Snake.h #include<stdio.h> #include<windows.h> #include<stdbool.h> #include<stdlib.h> #inclu…...

初入网络学习第一篇

引言 不磨磨唧唧&#xff0c;跟着学就好了&#xff0c;这个是我个人整理的学习内容梳理&#xff0c;学完百分百有收获。 1、使用的网络平台:eNSP 下载方法以及内容参考这篇文章 华为 eNSP 模拟器安装教程&#xff08;内含下载地址&#xff09;_ensp下载-CSDN博客https://b…...

(项目管理系列课程)项目规划阶段:项目范围管理-收集需求

在项目管理中&#xff0c;“规划过程组”是指一系列旨在定义和细化项目目标、规划如何达到这些目标并管理项目工作的过程。在这个过程中&#xff0c;“收集需求”是一个至关重要的活动&#xff0c;它涉及到识别和记录项目干系人的需求&#xff0c;以确保项目最终能够满足干系人…...

SQl注入文件上传及sqli-labs第七关less-7

Sql注入文件上传 1、sql知识基础 secure_file_priv 参数 secure_file_priv 为 NULL 时&#xff0c;表示限制mysqld不允许导入或导出。 secure_file_priv 为 /tmp 时&#xff0c;表示限制mysqld只能在/tmp目录中执行导入导出&#xff0c;其他目录不能导出导入。 secure_fil…...

想成为月薪过万的软件测试工程师?快看过来!

软件测试人员的工作主要是检测软件系统中的存在的BUG&#xff0c;但并不是毫无逻辑的盲目抓瞎。学会运用测试思维去完成测试工作&#xff0c;会使你的工作事半功倍。 01 软件测试的前提假设 测试人员进行软件测试的基本假设是“有罪推断”。即&#xff1a;认为被测程序一定是…...

找生网站方案———未来之窗行业应用跨平台架构

1&#xff09;网站设计方面的考虑 主色调采用于公司深蓝色颜色&#xff0c;网页整体色彩明快、大气、简洁&#xff0c;每个细节均经过精心处 理&#xff0c;网页浏览快速&#xff0c;导航明确清晰。 网页设计要充分考虑网页的整体感觉&#xff0c;每个页面的图片与网站色调的过…...

全网都在找的Python生成器竟然在这里!简单几步,让你的代码更简洁、更高效!

博客主页&#xff1a;长风清留扬-CSDN博客系列专栏&#xff1a;Python基础专栏每天更新大数据相关方面的技术&#xff0c;分享自己的实战工作经验和学习总结&#xff0c;尽量帮助大家解决更多问题和学习更多新知识&#xff0c;欢迎评论区分享自己的看法感谢大家点赞&#x1f44…...

插入排序,希尔排序,和归并排序

每一本数据结构和算法的教科书中&#xff0c;都不厌其烦的介绍了排序算法。不厌其烦的介绍10余种不同的排序。那么实际编程中用得到那么多排序算法吗&#xff1f;当然用不到。那么为什么全世界的教科书都这么写呢&#xff1f;显然是醉翁之意不在酒。 数组&#xff0c;是每个编…...

Prompt 模版解析:诗人角色的创意引导与实践

Prompt 模版解析&#xff1a;诗人角色的创意引导与实践 Prompt 模版作为一种结构化工具&#xff0c;旨在为特定角色——本例中的“诗人”——提供明确的指导和框架。这一模版详尽地描绘了诗人的职责、擅长的诗歌形式以及创作规则&#xff0c;使其能在自动化系统中更加精确地执…...

zookeeper选举kafka集群的controller

zookeeper选举kafka集群的controller目录 文章目录 zookeeper选举kafka集群的controller目录前言一、实操体验controller的选举二、模拟controller选举四、删除controller节点 前言 kafka集群的controller是kafka集群中一个有特殊作用的broker&#xff0c;负责整个kafka集群的…...

吉如一线段树:区间最值和历史最值

区间最值和历史最值 问题一 给定一个长度为 n n n 的数组 a a a , 实现以下三种操作 : 0 l r x : 将 a r r [ l ∼ r ] arr[l\sim r] arr[l∼r] 范围的每个数 v v v , 更新为 min ⁡ ( v , x ) \min (v, x) min(v,x) 1 l r : 查询 max ⁡ i l r a r r i \max_{il}^r ar…...

数据库常见的安全特性有哪些

数据库的安全特性主要包括以下几个方面&#xff0c;以确保数据的机密性、完整性和可用性&#xff1a; 1. 身份验证&#xff08;Authentication&#xff09; 数据库系统会通过身份验证来确定用户的身份&#xff0c;常见的方式有用户名/密码验证、基于证书的验证、多因素验证&a…...

Debezium日常分享系列之:Debezium 3.0.0.Final发布

Debezium日常分享系列之&#xff1a;Debezium 3.0.0.Final发布 Debezium 核心的变化需要 Java 17基于Kafka 3.8 构建废弃的增量信号字段的删除每个表的详细指标 MariaDB连接器的更改版本 11.4.3 支持 MongoDB连接器的更改MongoDB sink connector MySQL连接器的改变MySQL 9MySQL…...

MVCC(多版本并发控制)

目录 1.MVCC的工作原理2.MVCC的优点3.例子 MVCC&#xff08;多版本并发控制&#xff09;是一种用于数据库管理系统中实现并发控制的技术。它允许多个事务同时对数据库进行读写操作&#xff0c;而不会相互干扰&#xff0c;从而提高数据库系统的性能和可用性。MVCC通过为每个事务…...

低代码可视化-uniapp响应式数据data-代码生成器

在uniapp框架中&#xff0c;data 是一个核心的概念&#xff0c;它代表了组件或uniapp实例中的响应式数据。这些数据是组件状态的基础&#xff0c;uniapp会根据这些数据的变化来更新DOM&#xff0c;从而保持视图与数据的同步。 data 的特点 响应式&#xff1a;uniapp使用一种称…...

10.7学习

1.安全认证 ●Session 认证中最常用的一种方式&#xff0c;也是最简单的。存在多节点session丢失的情况&#xff0c;可通过nginx粘性Cookie和Redis集中式Session存储解决 ●HTTP Basic Authentication 服务端针对请求头中base64加密的Authorization 和用户名和密码进行校验。…...

基础算法之前缀和--Java实现(下)--LeetCode题解:-和为 K 的子数组 - 和可被 K 整除的子数组 -连续数组-矩阵区域和

这里是Themberfue 和为 K 的子数组 题目解析 返回子数组中所有元素的和等于给定k的个数。 算法讲解 这题好像是用滑动窗口解决&#xff0c;但其实不能&#xff0c;因为 nums 中的元素可能存在负数&#xff0c;就不能保证其单调性的性质。 用前缀和求也不易想到&#xff0c;…...

序列化与反序列化基础及反序列化漏洞(附案例)

参考文章&#xff1a; [web安全原理]PHP反序列化漏洞 - 笑花大王 - 博客园 (cnblogs.com) 一、概念 为了能有效的存储数据而不丢失数据的类型和内容&#xff0c;经常需要通过序列化对数据进行处理&#xff0c;将数据进行序列化后&#xff0c;会生成一个字符串&#xff0c;字符…...

Khronos:动态环境下时空度量语义SLAM的统一方法

Khronos: A Unified Approach for Spatio-Temporal Metric-Semantic SLAM in Dynamic Environments 原文 项目 引言&#xff1a; 人类居住环境通常是高度动态的&#xff0c;人、机器人和其他实体不断移动、互动和改变场景。对于机器人在这种情况下的操作&#xff0c;仅仅建立一…...

一个迷茫的25岁前端程序员的自述

作者&#xff1a;一尾流莺 一直听说程序员的危机在 35 岁&#xff0c;没想到我的危机从 25 岁就开始了。 我甚至不知道自己是不是 25 岁&#xff0c;也可能是 26 岁&#xff0c;或者 27 岁&#xff0c;1998 年的生日&#xff0c;按照 2023 - 1998 的算法就是 25&#xff0c;按…...

多文件并发多线程MD5工具(相对快速的MD5一批文件),适配自定义MD5 Hash I/O缓存。

自己写的多文件 MD5校验工具&#xff0c;一个文件开一个线程&#xff0c;有最大I/O 缓存设置&#xff0c;兼容读写MD5后缀文件。 共计91个文件&#xff0c;合计180G左右 12分钟左右&#xff0c;UI基本卡废&#xff0c;但程序没蹦&#xff0c;属于正常。 卡的原因是基本是用 I/O…...

Pikachu-url重定向-不安全的url跳转

不安全的url跳转 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话就可能发生"跳错对象"的问题。 url跳转比较直接的危害是: …...

如何下载和安装CLion,图文详解

一、下载 登录JetBrains官网&#xff0c;下载最新版本的Clion&#xff0c;Clion目前没有社区版&#xff0c;都是专业版。 二、安装 1、启动Clion安装程序&#xff0c;下一步。 2、修改安装目录&#xff0c;下一步。 3、创建桌面快捷方式&#xff0c;更新PATH变量&#xff0…...

vue3导入本地图片2种实现方法

在<script setup>中使用import语法&#xff1a; <template><img :src"logo" alt"Logo"> </template><script setup> import logo from ./assets/logo.png; </script> 使用Vue的ref来动态地在<script setup>中…...

leetcode 刷题day36动态规划Part05 背包问题(完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ、70. 爬楼梯 (进阶))

完全背包 完全背包的每件商品都有无限个&#xff0c;和01背包的一不同主要体现在遍历顺序上。为了保证每个物品仅被添加一次&#xff0c;01背包内嵌的循环是从大到小遍历。而完全背包的物品是可以添加多次的&#xff0c;所以要从小到大去遍历。 518. 零钱兑换 II 思路&#…...

检查jar冲突,查找存在相同class的jar

写在前面 本文看下如何查找jar冲突&#xff0c;即查找哪些jar包中存在相同的class。如果是存在相同jar的不同版本&#xff0c;基本一眼就能看出来&#xff0c;然后结合maven的依赖关系将其剔除掉即可&#xff0c;但是当你遇到了有人手动拷贝某些class到jar包中导致冲突的情况时…...

PhpStudy-PHP5.4.45后门漏洞应用程序(C++/base64/winhttp)

PhpStudy-PHP5.4.45后门漏洞应用程序&#xff08;C/base64/winhttp&#xff09; 前言引言&#xff08;时间回到多年前&#xff09; PhpShellCmd.exe使用介绍&#xff1a;&#xff08;1&#xff09;输入网址检测是否存在PHP/5.4.45&#xff08;2&#xff09;whoami&#xff08;3…...

【优选算法】(第二十七篇)

目录 重排链表&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 合并K个升序链表&#xff08;hard&#xff09; 题目解析 讲解算法原理 编写代码 重排链表&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;LeetCod…...

学习Flask框架

Flask简介 Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug &#xff0c;模板引擎则使用 Jinja2 。Flask使用 BSD 授权。 Flask也被称为 “microframework” &#xff0c;因为它使用简单的核心&#xff0c;用 extension 增加其他功能。Flask没…...