#前言:

该文是我准备Djang十日学习文章的第三篇,最后会做个项目,大家有兴趣的话可以关注我坐等后续,并且欢迎各位大佬指正错误。

前两篇主要讲了Django的配置创建:Python之创建Django(保姆级教程)-CSDN博客,以及Django中各个文件的作用和路由与视图函数之间的一些基本关系:Python之Django文件夹中各个模块的功能-CSDN博客,有兴趣可以进行阅读。今天我会详细讲解Django中的路由及其涉及的一些基本操作,后续还会继续完善,欢迎各位大佬来指正。

一.路由的介绍:

在 Django 中,路由(也称为 URL 配置)是用于确定如何将 HTTP 请求映射到视图函数或类的机制。路由的作用是将特定的 URL 请求与相应的视图函数或类关联起来,以便 Django 能够根据请求的 URL 来调用相应的处理逻辑。

具体来说,路由在 Django 中起到以下作用:

  1. URL 映射: 路由将 URL 请求映射到对应的视图函数或类。当用户访问特定的 URL 时,Django 能够根据路由配置确定应该调用哪个视图来处理该请求。

  2. URL 命名: 路由允许为 URL 命名,使得在模板中和视图函数中能够动态地生成 URL。这样做可以避免硬编码 URL,提高代码的可维护性和可重用性。

  3. URL 参数传递: 路由允许从 URL 中提取参数,并将这些参数传递给相应的视图函数或类进行处理。这样可以实现动态 URL,例如在 URL 中包含资源的标识符或查询参数。

在 Django 中,路由通常由 URL 配置文件(如 urls.py)来定义和管理。URL 配置文件中包含了 URL 路由规则的列表,每条规则都指定了一个 URL 模式和一个对应的视图函数或类。Django 在接收到 HTTP 请求时,会根据 URL 配置文件中的路由规则来确定要调用哪个视图来处理请求。

总的来说,路由在 Django 中扮演着将 URL 请求映射到处理函数或类的关键角色,帮助实现了 URL 到视图之间的解耦和灵活性。

二.Django中关于路由的基本操作:

1.路由分发:

关于路由的分发,首先得清楚路由的分发是因为在创立整个项目时,尤其对于某些有很多应用的难免会出现很多路由以及路由名字一样的情况,这个时候就需要将路由进行一个分发,分配在每个应用中各司其职,既方便操作,又会防止出现很多错误。

第一步:创建两个应用:

(我是以myapp和myapp2命名的),(具体创建操作在我上篇博客中有所具体介绍)。

第二步:在setting.py文件下面的INSTALLED_APPS里面注册应用:

第三步:在两个应用文件下面都创建一下urls.py文件:

第四步:在根路由里面分发路由:

from django.contrib import admin
from django.urls import path,include
urlpatterns = [
    path('admin/', admin.site.urls),
    #inclde 在根目录路由中进行路由分发

    path('myapp/',include('myapp.urls')),#对myapp分发一个路由
    path('myapp2',include('myapp2.urls'))
]

上面这个操作就是对myapp和myapp2应用分发路由,使用的是include,注意前需要先导包。

2.匹配路由:

1、正则表达:

re_path 方法进行匹配正则。

在需要对应用户的数据进行验证或者获取某一类型的数据的时候会使用正则。

# 使用正则表达式匹配路由格式:r'^正则表达式/$'
re_path(r'^[A-Za-z]+/$' , views.re_view),

def re_view(request):
    return HttpResponse('这个视图的路由是英文字母响应')

注意代码是分别在urls.py文件里面和view.py文件里面的。

2、URL 参数传递

在 path 解析 url中携带的参数,使用 <name> 来获取路由中对应位置的数据。

url 获取到数据之后会作为参数传递给对应的视图函数,视图函数获取的参数名称也必须是 url 中指定的名称。

path('demo/<urldata>/' , views.get_url_data),

def get_url_data(request , urldata):
    return HttpResponse(f'从 URL 中获取到的参数为:{urldata}')

url 映射中的 path 或者 re_path 方法可以传入第三个参数 , 这个参数类型是一个字典类型,会作为请求的附加数据,在响应对应的视图函数时会传递过去作为参数使用。

3、路由转换器

路由获取到的所有参数的数据类型都是字符串类型.

转换器的本质上也是用正则进行匹配。

# 转换器的写法:<转换器名称:参数名>
# int: 匹配 0以及正整数。获取到的数据会被解析为 int 类型
path('int/<int:data>/' , views.int_view),
# str: 匹配除了 URL分隔符(/)之外的非空字符串
path('str/<str:data>/' , views.str_view),
# path: 匹配任意非空字符串
path('path/<path:data>/' , views.path_view),
# slug: 匹配字母,数字,下划线,横线组成的字符串
path('slug/<slug:data>/' , views.slug_view),
# uuid: 通用唯一标识符 : [a-z0-9-]+ , 小写字母、数字、横线
# eg: 510121b4-f758-ccaf-5e35-d086e4682ce5 :8-4-4-4-12 一共32个字符
path('uuid/<uuid:data>/' , views.uuid_view),
def int_view(request , data):
    print(type(data))   # <class 'int'>
    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} ')

3.反向解析路由:

反向解析路由实际上就是给原先很长的路由起了一个别名,以此方便前后端调用过程中出现错误,也会方便很多。

在 html 模板中反向解析路由的格式: {% url 'URL的模式名称' 参数 %}。

在urls.py文件中,用name=别名 的形式来对它进行解析,具体可以看代码:

<body>
反向解析路由<br>
<a href="/urlapp2/index/">点击看新闻</a><br>
<a href="{% url 'num' %}">点击开奖</a><br>
<a href="{% url 'age' 28 %}">不要点击</a><br>
</body>
# name 参数为 url 的模式名称
path('number/' , views.number , name='num'),
path('age/<data>/' , views.data_view , name='age')

上面就是把路由为'number'的起了个别名'num'。

在后端视图中直接用redirct()就可以平替它。

4.URL的应用名称空间:

在应用的 urls.py 文件中,在 urlpatterns 列表前 定义 app_name 的属性。

# 定义当前应用的 url 应用名称空间
app_name = 'urlapp2'

注意:在对应用名称定义看见之后关于反向解析路由就会和上文出现不同。

需要:{% url 'url名称空间:url模式名称' %}。

<body>
反向解析路由<br>
<!-- 
    当后端给 url 定义了应用名称空间之后
    在 html 中进行反向解析的时候,必须指定到那一个名称空间内查询
-->
{# {% url 'URL的应用名称空间:URL的模式名称' 参数 %} #}
<a href="{% url 'urlapp2:num' %}">点击开奖</a><br>
<a href="{% url 'urlapp2:age' 28 %}">不要点击</a><br>
</body>

在后端文件中也需要做出上述更改:

def text(request):
    # 导入 reverse 解析路由方法
    return HttpResponse(f'视图解析路由:{reverse("urlapp2:num")}')

def redirect_reverse(request):
    # return redirect(reverse("num"))
    # redirect 是可以直接使用 url 中的模式名称
    return redirect('urlapp2:num')

def text_data(request,data):
    # reverse("模式名称" , args=[参数]/kwargs={参数})
    return HttpResponse(f'视图解析路由:{reverse("urlapp2:age" , args=[data])}')

三.总结:

该篇博客主要讲解了Django中关于路由的一些具体操作,包括从路由的分发、路由的匹配、解析路由、路由的应用名称空间等。如若各位大佬发现错误欢迎大家指正,后续会继续更新Django的其它操作,有兴趣的朋友可以关注一下,坐等后续。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐