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

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

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

相关文章

Ambari搭建Hadoop集群 — — 问题总结

Ambari搭建Hadoop集群 — — 问题总结 一、部署教程&#xff1a; 参考链接&#xff1a;基于Ambari搭建大数据分析平台-CSDN博客 二、问题总结&#xff1a; 1. VMwear Workstation 查看网关 2. 资源分配 参考&#xff1a; 硬盘&#xff1a;master&#xff08;29 GB&#xff…

手机使用技巧:8 个 Android 锁屏移除工具 [解锁 Android]

有时候&#xff0c;您会被锁定在自己的 Android 设备之外&#xff0c;而且似乎不可能重新进入。 一个例子就是你买了一部二手手机&#xff0c;后来发现无法使用。另一种情况是你忘记了屏幕锁定密码和用于验证密码的 Google 帐户凭据。这种情况很少见&#xff0c;但确实会发生&…

15分钟学 Python 第35天 :Python 爬虫入门(一)

Day 35 : Python 爬虫简介 1.1 什么是爬虫&#xff1f; 网页爬虫&#xff08;Web Crawler&#xff09;是自动访问互联网并提取所需信息的程序。爬虫的主要功能是模拟用户通过浏览器访问网页的操作&#xff0c;从而实现对网页内容的批量访问与信息提取。它们广泛应用于数据收集…

RTEMS面试题汇总及参考答案

目录 RTEMS是什么?它在嵌入式系统中扮演什么角色? RTEMS的全称是什么? RTEMS的主要特点有哪些? RTEMS支持哪些处理器架构? RTEMS的可剥夺型内核和不可剥夺型内核有何不同? RTEMS 的微内核设计及其优势 RTEMS 如何实现多任务处理和调度 RTEMS 的任务调度策略有哪…

Unity各个操作功能+基本游戏物体创建与编辑+Unity场景概念及文件导入导出

各个操作功能 部分功能 几种操作游戏物体的方式&#xff1a; Center:有游戏物体父子关系的时候&#xff0c;中心点位置 Global/Local:世界坐标系方向/自身坐标系方向 &#xff1a;调试/暂停/下一帧 快捷键 1.Alt鼠标左键&#xff1a;可以实现巡游角度查看场景 2.鼠标滚轮…

MySQL从0到1基础语法笔记(上)

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;Java Web关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 MySQL笔记&#xff1a; 一、注释&#xff1a; 二、SQL四大类&#xff…

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

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

、并发请求

初始化 const axios require(axios) const apis [url1, url2, url3] // 模拟 http apis并发函数 /*** param {Array<string>} apis* param {number} maxNum 最大并发量* returns {Promise}*//*** param {Array<string>} apis 请求的API集* param {number} maxN…

在线测径仪都有哪些别称?

在线测径仪广泛运用于电线电缆、输送管、金属丝、PVC管、医疗器械、塑料、金属拉丝、橡胶、高线、圆钢、钢筋、螺纹钢、钢管、轧钢等生产行业&#xff0c;主要用于这些行业生产出的产品的直径、椭圆度&#xff08;双轴及以上测头&#xff09;等的检测。 测径仪为在线检测设备&a…

等保测评中的关键技术应用:防火墙与入侵检测系统

在当今数字化时代&#xff0c;网络安全已成为企业运营不可或缺的一部分。等级保护&#xff08;简称“等保”&#xff09;制度作为中国网络安全领域的一项重要法规&#xff0c;旨在通过不同等级的安全保护要求&#xff0c;确保信息系统免受各类威胁和破坏&#xff0c;保障信息的…

【C#生态园】打造现代化跨平台应用:深度解析.NET桌面应用工具

选择最适合你的.NET UI框架&#xff1a;全面解析六种热门选择 前言 在现代软件开发中&#xff0c;选择合适的桌面应用框架和UI库对于开发人员来说至关重要。本文将介绍几种流行的.NET桌面应用框架和UI库&#xff0c;包括Eto.Forms、Avalonia、ReactiveUI、MahApps.Metro、Mat…

智能指针详解

目录 智能指针原理 RAII Unique_ptr Shared_ptr Shared_ptr缺点 定制删除器 在C库里提供的智能指针有跟多&#xff0c;如下图所示&#xff0c;使用时需要包含头文件<memory>。下面将详细介绍这些智能指针的底层原理和缺点&#xff0c;还有每个智能指针的应用场景。…

AI寒冬?不,2025年将是AI代理之年

引言 近年来,人工智能(AI)的发展速度令人瞩目,但一些观察者认为今年的前六个月相对“缓慢和无趣”。然而,这种观点可能忽略了AI在多个领域的持续进步。本文将探讨为什么我们不应该轻易使用“AI寒冬”这样的说法,并展望2025年作为AI代理之年的潜力。 为何不应轻易使用“…

Linux No space left on device分析和解决

报错解释&#xff1a; "No space left on device" 错误表示你的Linux设备&#xff08;通常是磁盘分区&#xff09;上没有剩余空间了。这可能是因为磁盘已满&#xff0c;或者inode已满。磁盘空间是指磁盘上的实际空间&#xff0c;而inode是用来存储文件元数据的数据结…

嘉立创EDA中PCB快速画螺旋触摸焊盘或其他不规则形状

常见触摸焊盘 首先需要有CAD软件 使用CAD的原因&#xff1a;能快速编辑线条和不规则形状&#xff0c;在嘉立创EDA中不能快速完成。 画图整体步骤&#xff1a; 1&#xff0c;先在CAD中画出螺旋线&#xff08;HELIX&#xff09; 这里需要设置底部半径&#xff0c;圈数和顶部半…

【MYSQL】mysql约束---自增长约束(auto_increment)

1、概念 在Mysql中&#xff0c;当主键为自增长后&#xff0c;这个主键的值就不再需要用户输入数据了&#xff0c;而由数据库系统根据定义自动赋值。每增加一条记录&#xff0c;主键会自动以相同的步长进行增长。 注意&#xff1a;自增长约束通常与主键放在一起使用。 通过给…

网盘能否作为FTP替代产品?企业该如何进行FTP国产化替代?

近年来&#xff0c;信创的概念引入和高效实践落地让更多的行业企业自发性地进行国产化替代&#xff0c;目前信创国产化替代还多发生在操作系统和应用层面&#xff0c;软件工具等目前还在下一阶段规划&#xff0c;但很多企业未雨绸缪&#xff0c;已经在做调研和尝试。 FTP作为世…

守护网络安全:从日常生活做起的防护策略

引言 在信息化时代&#xff0c;网络已成为我们生活中不可或缺的一部分。它为我们提供了快速沟通和便捷服务的渠道&#xff0c;使我们能够高效地办理业务、完成工作和享受娱乐。然而&#xff0c;随着网络的普及和信息化程度的加深&#xff0c;我们在享受便利的同时&#xff0c;…

codetop标签双指针题目大全解析(三),双指针刷穿地心!!!!!

复习比学习更重要&#xff0c;更需要投入时间&#xff0c;更需要花费精力 1.字符串的排列2.找出字符串中第一个匹配的下标3.最大连续1的个数II4.数组中的山脉5.移除元素6.两个数组的交集II7.有序数组的平方8.删除有序数组中的重复项II9.寻找重复数10.水果成篮 1.字符串的排列 …