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.rhkb.cn/news/444589.html

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

相关文章

如何提高专利申请的成功率?

在当今充满创新与竞争的时代&#xff0c;专利成为了保护智力成果、赢得市场优势的重要武器。然而&#xff0c;专利申请并非一帆风顺&#xff0c;许多申请人在这一过程中面临诸多挑战&#xff0c;导致申请成功率不尽如人意。那么&#xff0c;如何才能在这复杂的专利申请之路上提…

宝塔 进程守护管理器 神坑,再次跌入。thinkphp-queue队列 勤勤学长

如果&#xff0c;你有在使用【进程守护管理器】&#xff0c;记得在更新/重启&#xff0c;甚至卸载重新安装后&#xff0c;重启服务器。 事情的起因是&#xff0c;昨日服务器突然异常&#xff0c;网站无法正常访问&#xff0c;进入宝塔面板&#xff0c;发现 cpu和负载率均超过1…

2024.10月11日--- SpringMVC拦截器

拦截器 1 回顾过滤器&#xff1a; Servlet规范中的三大接口&#xff1a;Servlet接口&#xff0c;Filter接口、Listener接口。 过滤器接口&#xff0c;是Servlet2.3版本以来&#xff0c;定义的一种小型的&#xff0c;可插拔的Web组件&#xff0c;可以用来拦截和处理Servlet容…

1000题-计算机网络系统概述

术语定义与其他术语的关系SDU&#xff08;服务数据单元&#xff09;相邻层间交换的数据单元&#xff0c;是服务原语的表现形式。在OSI模型中&#xff0c;SDU是某一层待传送和处理的数据单元&#xff0c;即该层接口数据的总和。 - SDU是某一层的数据集&#xff0c;准备传递给下一…

ICDE 2024最新论文分享|BEEP:容量约束下能够对抗异常干扰的航运动态定价系统

论文简介 本推文详细介绍了上海交通大学高晓沨教授和陈贵海教授团队发表在顶级学术会议ICDE 2024上发表的最新论文《Corruption Robust Dynamic Pricing in Liner Shipping under Capacity Constraint》&#xff0c;该论文的学生作者为胡永祎、李雪嫣、魏熙锴&#xff0c;合作…

Midjourney零基础学习

Midjourney学习笔记TOP04 Midjourney的各种参数设置 Midjourney的用户操作界面没有醒目的工具栏、属性栏&#xff0c;所有的操作都是通过调用各种指令和参数进行的。 【MJ Version】 Midjourney在2023年3月份就已经更新到了V5版本&#xff0c;V5版本除了画质有所提升外&#…

MacOS 同时配置github、gitee和gitlab密钥

MacOS 同时配置github、gitee和gitlab密钥 1 在终端中新建 ~/.ssh目录 1.1 生成GitHub、Gitee和Gitlab的SSH密钥对 ssh-keygen -t ed25519 -C "xxxxxxxxxxx.com" -f ~/.ssh/id_ed25519_gitee ssh-keygen -t ed25519 -C "xxxxxxxxxxx.com" -f ~/.ssh/id_…

TikTok代理IP全面使用指南

对于那些希望通过社交媒体打造个人品牌的人来说&#xff0c;TikTok是现在热门的平台&#xff0c;他的流量与曝光不可小觑&#xff0c;相信很多跨境营销会选择他进行多账号营销。问题是&#xff0c;TikTok多账号很容易遇到封禁问题&#xff0c;那么如何解决&#xff1f; 一、什么…

无人机集群路径规划:5种优化算法(SFOA、APO、GOOSE、CO、PIO)求解无人机集群路径规划,提供MATLAB代码

一、单个无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化…

pytest:4种方法实现 - 重复执行用例 - 展示迭代次数

简介&#xff1a;在软件测试中&#xff0c;我们经常需要重复执行测试用例&#xff0c;以确保代码的稳定性和可靠性。在本文中&#xff0c;我们将介绍四种方法来实现重复执行测试用例&#xff0c;并显示当前迭代次数和剩余执行次数。这些方法将帮助你更好地追踪测试执行过程&…

Python | Leetcode Python题解之第468题验证IP地址

题目&#xff1a; 题解&#xff1a; class Solution:def validIPAddress(self, queryIP: str) -> str:if queryIP.find(".") ! -1:# IPv4last -1for i in range(4):cur (len(queryIP) if i 3 else queryIP.find(".", last 1))if cur -1:return &q…

Jupyter的使用分享

文章目录 碎碎念安装方法1.安装Anaconda方法2.通过库的安装方式 启动使用教程1.指定目录打开2.启动后的简单使用 小结 碎碎念 前情提示 之前与许多小伙伴交流的时候&#xff0c;发现大家对于pycharm更容易上手&#xff08;可能是比较好设置中文的原因&#xff09;&#xff0c;在…

【MySQL】-- 表的操作

文章目录 1. 查看所有表1.1 语法 2. 创建表2.1 语法2.2 示例2.3 表在磁盘上对应的文件 3. 查看表结构3.1 语法3.2 示例 4. 查看创建表的语句5. 修改表5.1 语法5.2 示例5.2.1 向表中添加一列5.2.2 修改某列的长度5.2.3 重命名某列5.2.4 删除某个字段5.2.5 修改表名 6. 删除表6.1…

CANoe_调用C#控件的方法_DEMO方法演示

1、DEMO存放位置 D:\Users\Public\Documents\Vector\CANoe\Sample Configurations 11.0.96\CAN\MoreExamples\ActiveX_DotNET_Panels 每个人的电脑因为有区别存放位置不一样 2、控件制作--使用C#控件可以直接制作 3、控件代码 using System; using System.Collections; usi…

Java调用WebService接口实践案例

最终效果 在网上找了一个免费的webservice接口简单做个测试,可以正常返回结果 public static void main(String[] args) {String url = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx";String xmlData = "<soapenv:Envelope xmlns:soapen…

springboot 整合spring ai实现 基于知识库的客服问答

rag 需求产生的背景介绍&#xff1a; 在使用大模型时&#xff0c;常遇到的问题之一是模型可能产生幻觉&#xff0c;即生成的内容缺乏准确性。此外&#xff0c;由于大模型不直接访问企业的专有数据&#xff0c;其响应可能会显得泛泛而谈&#xff0c;不够精准或具体&#xff0c;…

onnx代码解读

一、定义 torch.jit.trace 相关代码解读onnx 内部实现 3 查看是否为aten 算子aten 算子实现torch.autograd.Functions 算子实现自定义算子实现查找未实现的节点一次性发现所有的未实现 aten 算子 二、实现 torch.jit.trace 相关代码解读 1. torch.jit.script() : 将其转换为…

CSD(computational storage devices)架构介绍

CSD&#xff08;computational storage devices&#xff09;架构介绍 前言一、CSD与传统SSD的架构对比二、为什么要采用FPGA三、FPGA缺点四、个人总结reference 前言 虽然一直有接触CSD&#xff0c;但一直对其原理和架构知之甚少&#xff0c;半知不解。今天&#xff0c;趁着我还…

CSS计数器

CSS 中的计数器类似于变量&#xff0c;可以实现简单的计数功能&#xff0c;并将结果显示在页面上&#xff0c;在早期的网站上应用比较广泛。要实现计数器需要用到以下几个属性&#xff1a; counter-reset&#xff1a;创建或者重置计数器&#xff1b;counter-increment&#xf…

机器学习框架(含实例说明)

机器学习框架是用于开发和部署机器学习模型的软件库和工具集。它们提供了一系列的算法、工具和基础设施&#xff0c;帮助开发者更高效地构建、训练和部署机器学习模型。以下是一些主要的机器学习框架及其详细介绍&#xff1a; 1. TensorFlow TensorFlow 是由Google开发的开源…