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

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 views

urlpatterns = [
    path('index/', views.index),
]

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

2.2项目的路由分发

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

# 项目的根目录 urls.py
from django.urls import path, include

urlpatterns = [
    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 views

urlpatterns = [
    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 path

urlpatterns = [
    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 redirect

def 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 views

urlpatterns = [
    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.kler.cn/news/333302.html

相关文章:

  • ansible用户管理模块和剧本
  • 【Linux】深入理解 Linux 系统命令:网络配置、压缩打包与其他常用命令
  • 芝法酱学习笔记(0.6)——nexus与maven私库
  • ReactJSX使用
  • 【环境配置】科研小白Windows下安装Git
  • 【LeetCode】每日一题 2024_10_5 完成旅途的最少时间(二分答案)
  • 大厂面试真题-介绍以下Docker的Overlay网络
  • 【漏洞复现】泛微OA E-Office do_excel.php 任意文件写入漏洞
  • 模拟算法(1)_替换所有的问号
  • C# 无边框窗体,加阴影效果、多组件拖动、改变大小等功能完美实现优化版效果体验
  • 【Linux】进程优先级、调度、命令行参数:从理论到实践(二)
  • 进程状态及优先级
  • 快速扩展随机数算法
  • Python入门--函数
  • Python批量下载PPT模块并实现自动解压
  • Vue中使用ECharts实现热力图的详细教程
  • 【SpringBoot详细教程】-10-SpringBoot整合swagger【持续更新】
  • 10/1 力扣 49.字母异位词分组
  • 安装Rust
  • 解决json格式转换被特殊字符截断问题