7、Django进阶:Django路由系统精讲:揭秘Django的路由系统从URL映射到视图处理的全过程(必掌握)

目录

什么是路由系统(路由系统的定义)

URL模式

URLconf的配置

URL名称和反向解析

URL参数

include-嵌套URLconf

Django路由系统应用

1)配置第一个URL实现页面访问

2)正则与正则分组使用

3)正则捕获组使用

4)参数传递与命名URL

URL映射与路由匹配

路由系统的最佳实践

path()、re_path()与url()函数

1. path()函数

2. re_path()函数

3. url()函数

path()、re_path()和url()函数之间的区别和适用场景

总结


图片

更多关于Django的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流或加文末的技术交流群。

图片

Django是一个功能强大的Python Web框架,其路由系统是构建Web应用程序的核心之一。Django路由系统是实现URL与视图之间映射的关键组件。Django提供了灵活多样、功能强大的路由系统, 提供了多种路由配置方式,包括path()、re_path()和url()函数,使开发者能够轻松构建复杂的URL结构,并将请求传递给相应的视图进行处理。

原文:7、Django进阶:Django路由系统精讲:揭秘Django的路由系统从URL映射到视图处理的全过程(必掌握)

理解并熟练运用路由系统的URL映射、路由匹配、参数传递和命名URL等功能,将对开发高效、可维护的Web应用起到重要的作用。在实际应用中,我们应根据需求灵活运用路由系统的各种功能,并遵循最佳实践,以构建健壮、易于扩展的应用。

本文将深入讲解Django的路由系统,帮助读者更好地理解和应用它,内容包括如下:

  • 对路由系统的定义和URL的模式做了介绍。

    详细介绍了Django路由系统的定义与使用,包括URL映射与路由匹配、参数传递与命名URL等内容。

  • 介绍了URLconf的配置和使用方法、URL的名称和反向解析,以及URL的参数。

    通过合理配置路由系统,我们能够实现灵活的URL映射和请求分发。

  • 通过include实现URLconf的嵌套

  • Django路由系统的应用示例。

  • URL的映射和路由匹配,以及路由系统的一个最佳实践。

  • 本文的最后一节总结了Django的三种路由配置方式:path()、re_path()与url()函数的定义、特点和使用方法,以及它们之间的区别和适用场景:

 在Django中,有三种常用的路由配置方式:path()、re_path()和url(),我详细介绍它们的作用、特点、用法以及之间的区别。包括URL映射、路由匹配、正则表达式规则以及路由参数的传递等内容,帮助开发者全面理解并灵活运用这个重要的模块。

  • path()函数是Django 2.0版本引入的新路由配置方式,使用简单的字符串模式匹配URL。

  • re_path()函数是Django 1.11版本之前的路由配置方式,使用正则表达式匹配URL模式。

  • url()函数是Django早期版本的路由配置方式,现在已经不推荐使用。

  

根据Django官方的推荐,我们应该优先使用path()函数来配置路由,因为它更简洁、直观,且不需要使用正则表达式。但在某些特定情况下,如果需要更灵活的匹配规则,可以使用re_path()函数或url()函数。无论是简洁直观的path()函数、灵活的re_path()函数还是传统的url()函数,都可以根据具体需求选择合适的方式来配置Django的路由系统。

通过本文对这三种函数的特点和用法详细介绍、以及对比分析,帮助读者理解它们的区别和适用场景。通过实例演示,展示了它们在实际应用中的灵活性和强大的功能。

希望这个详细的解释能满足你的要求,如果还有其他问题,请关注公众号CTO Plus随时后台留言交流。

 

本篇属于Django进阶系列的第7篇:

接下来让我们一起开始深入探索Django路由的奥秘,提升开发效率,构建高效的Web应用!

什么是路由系统(路由系统的定义)

在Django中,路由系统是负责将URL映射到对应的视图函数或类的重要组件。它的作用是将用户发起的请求路由到正确的处理函数,以便返回相应的结果。

在Web应用程序中,路由系统是一个URL映射表,路由系统用于将URL映射到相应的视图函数或处理程序(类)上。简单来说,它决定了当用户访问特定URL时,应该执行哪个视图函数或处理程序来处理请求。

在Django中,我们使用URL配置文件来定义路由规则,即路由系统由URLconf(URL配置)来定义和管理。URL配置文件是一个Python模块(URLconf),其中包含了URL模式和对应的视图处理函数(处理程序)。通过URLconf,我们可以指定不同URL的映射关系,以及处理请求的视图函数或处理程序。

更多关于Django的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

URL模式

在Django的URLconf中,URL模式是用于匹配URL的规则。URL模式是一个包含正则表达式和视图函数或处理程序的元组。

在URL模式中,我们可以使用正则表达式来匹配URL的不同部分。正则表达式是一种强大的工具,用于模式匹配和字符串搜索。通过使用正则表达式,我们可以灵活地定义URL模式,以满足不同的匹配需求。

除了正则表达式,URL模式还包含一个视图函数或处理程序。这个视图函数或处理程序将在URL匹配成功时执行,并处理相应的请求。

URLconf的配置

在Django项目中,我们需要在urls.py文件中配置URLconf。这个文件位于项目的根目录中,并且是一个Python模块。

在urls.py文件中,我们需要导入Django的path函数,并使用它来定义URL模式。path函数接受三个参数:URL模式和视图函数或处理程序,以及一个name唯一的名称,这个名称的作用很大。

例如,以下是一个简单的URLconf示例:

from django.urls import pathfrom . import views
urlpatterns = [    path('', views.index, name='index'),    path('hello/', views.hello, name='hello'),]

在这个例子中,我们导入了Django的path函数和项目中的视图模块。然后,我们使用path函数定义了两个URL模式。第一个URL模式是空字符串,它将匹配项目的根URL。第二个URL模式是'hello/',它将匹配URL中包含'hello/'的部分。

对应于每个URL模式,我们指定了相应的视图函数。这些视图函数将在URL匹配成功时执行,并处理相应的请求。

URL名称和反向解析

在URLconf中,我们可以为每个URL模式指定一个唯一的名称。这个名称可以用于在代码中引用URL,而不是直接写入URL字符串。

为了指定URL名称,我们可以在path函数中使用name参数。在上面的示例中是一个带有URL名称的URLconf示例。

在这个例子中,我们为两个URL模式分别指定了名称'index'和'hello'。

有了URL名称,我们可以在代码中使用Django的反向解析功能来生成URL。反向解析是根据URL名称生成相应URL的过程。通过使用反向解析,我们可以避免在代码中硬编码URL字符串,提高代码的可维护性和可重用性。

例如,以下是一个使用反向解析生成URL的示例:

from django.urls import reverse
def my_view(request):    url = reverse('index')    return redirect(url)

在这个例子中,我们使用Django的reverse函数生成了名称为'index'的URL。然后,我们将生成的URL重定向到该URL。

关于reverse函数的详解我在公众号CTO Plus的针对Django重定向的文章中有详细的使用介绍,具体可以参考这篇文章:《13、Django进阶:深入解析URL重定向的HttpResponseRedirect, redirect和reverse三种用法和案例详解》

URL参数

在Django的URLconf中,我们可以使用尖括号(<>)来定义URL参数。URL参数是URL中的变量部分,它可以在视图函数或处理程序中使用。

例如,以下是一个带有URL参数的URLconf示例:

from django.urls import pathfrom . import views
urlpatterns = [    path('hello/<str:name>/', views.hello, name='hello'),]

在这个例子中,我们在URL模式中使用了尖括号来定义一个URL参数。这个URL参数被命名为'name',并且是一个字符串类型。

对应于URL参数,我们需要在视图函数或处理程序中定义一个参数来接收它。例如,以下是一个处理带有URL参数的视图函数的示例:

def hello(request, name):

    return HttpResponse(f"Hello, {name}!")

在这个例子中,我们定义了一个名为'hello'的视图函数,并在函数参数中添加了一个名为'name'的参数。这个参数将接收URL中的'name'部分的值。

更多关于Django的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

include-嵌套URLconf

在Django的URLconf中,我们可以使用include函数来嵌套其他URLconf。通过使用include函数,我们可以将URL模式分组到不同的URLconf中,以提高代码的可维护性和可重用性。

例如,以下是一个使用include函数嵌套URLconf的示例:

from django.urls import path, includefrom . import views
urlpatterns = [    path('blog/', include('blog.urls')),]

在这个例子中,我们使用include函数将'/blog/'路径映射到了另一个URLconf中。这个URLconf的名称是'blog.urls',它定义了与blog相关的URL模式和视图函数。

Django路由系统应用

首先,我们需要在项目的urls.py文件中定义主路由配置。主路由配置负责将请求分发给不同的应用程序。我们可以通过导入include函数来引入应用程序的子路由配置。

from django.urls import include, path
urlpatterns = [    path('app/', include('app.urls')),    # 其他路由配置...]

接下来,我们需要在应用程序的urls.py文件中定义子路由配置。子路由配置负责将请求路由到对应的视图函数或类。

from django.urls import pathfrom . import views
urlpatterns = [ # 最新的Django4中,这里将不能使用圆括号    path('home/', views.home),    path('article/<int:id>/', views.article_detail),    # 其他路由配置...]

一个用户向 Web 站点发送请求,是通过 URL 实现的,当 Web 服务器端接收到用户请求后,它又是怎么处理的呢?

通过 MTV 的设计模式,我们可以得知,首先用户请求会到达相应的视图函数,那么视图函数又是怎样找到相应的访问资源的呢,在这里就用到了“路由系统”。

Django 中利用ROOT_URLCONF 构建了 URL 与视图函数的映射关系。在 django.conf.urls 中封装了路由模块,新建的 Django 项目中提供了 urls.py(创建项目后自动生成的配置文件,新创建的APP需要自己手动创建)路由配置文件,urls.py 文件中定义了一个 urlpatterns 的列表,它是由 url( ) 实例对象组成的列表,Django 中 url 的定义就是在这个列表完成的。默认的样式如下:

from django.conf.urls import urlurlpatterns=[  url(r '^admin/',admin.site.urls),  ...]

可以看到后台 Admin 管理系统的路由就定义在了列表第一个位置,注意:在最新的版本Django4.2.2中url已被移除。最新版本的admin路由写法:path('admin/', admin.site.urls),

下面我们将详细介绍Django路由系统的定义与使用,并结合实例进行演示。

1)配置第一个URL实现页面访问

我们在上一节中的django_mvt项目下新建一个django_url的APP,用于演示路由系统,执行以下命令:

django-admin startapp django_url

在目录下新建一个urls.py 文件,我们在新建的APP的views.py中把它作为编写视图函数的 View 层,然后在 views.py 中编写如下代码:

from django.http import HttpResponse

def page_view(request):

    return HttpResponse('<h1>微信公众号:CTO Plus</h1>')

在 urls.py 文件中导入views.py, 这么做的目的是把 URL 与视图层进行绑定,然后在 urls.py 的 urlpatterns 中编写如下代码:

from django.conf.urls import url  # django3以下的写法from django_url import views
urlpatterns = [    url(r'page', views.page_view),]

代码的前 2 行分别对 URL 模块以及视图层 views 做了导包操作;

路径地址被定义为 page,也就是在本机浏览器地址栏输入:http://localhost/url/page 进行访问,views.page_view将 page/ 路径与对应的视图函数进行了关联。

紧接着我们在项目的urls.py文件下,将这个django_url APP的url使用include进行包含进来,代码如下:

path('url/', include('django_url.urls')),

同时将我们新建的APP django_url加入到项目的settings.py中的INSTALLED_APPS即可。

那么通过上述的代码就完成了路由的配置。在项目运行后,通过访问对应的地址就可以得到相应的页面了,如下图所示:

图片

2)正则与正则分组使用

在 Django 的路由系统中,正则匹配得到了充分的使用,比如要匹配任意 1000个页面,那么正则匹配路由地址可以写为:

url(r'^page(\d+)',views.page_view)

3)正则捕获组使用

捕获组:

url(r'(?P<name>\w+)/(?P<age>\d{1,2})', views.page_view2)

在视图函数层,用函数关键字传参的方法,将 name 与 age 传递给视图函数。

def page_view2(request, name, age):

    return HttpResponse(f"My name is {name}, age is {age}")

一个分组表示一个参数,多个参数需要使用多个分组,并且使用 / 隔开。

图片

4)参数传递与命名URL

路由参数的传递是通过URL模式中的正则表达式捕获URL的一部分,并作为参数传递给视图函数或类。我们可以在URL模式中使用尖括号<>来指定参数的位置和类型,然后在视图函数或类中接收参数。

from django.urls import pathfrom . import views
urlpatterns = [    path('article/<int:id>/', views.article_detail),    # 其他路由配置...]

在上面的例子中,我们将文章的id作为参数传递给视图函数article_detail。

命名URL是使用命名URL模式来方便地在模板中生成对应的URL。我们可以在URL模式中使用name参数来为URL模式命名。

from django.urls import pathfrom . import views
urlpatterns = [    path('article/<int:id>/', views.article_detail, name='article_detail'),    # 其他路由配置...]

在模板中,我们可以使用url模板标签来生成对应的URL。

<a href="{% url 'article_detail' id=1 %}">查看文章</a>

在上面的例子中,我们通过命名URL模式article_detail生成了查看文章的URL。

更多关于Django的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

URL映射与路由匹配

URL映射规则是URL配置文件中定义的URL模式与视图的映射规则。URL模式可以使用正则表达式来进行灵活的匹配。Django使用path函数来定义URL模式,可以指定URL的路径、参数和默认值等信息。

正则表达式规则是使用正则表达式匹配URL模式,实现灵活的匹配功能。在URL模式中,我们可以使用尖括号<>来指定参数的位置和类型。常用的参数类型包括int、str、slug等。

路由匹配顺序是URL模式的匹配顺序将决定请求由哪个视图处理。Django会按照URL配置文件中定义的顺序逐个匹配URL模式,直到找到匹配的模式为止。如果找不到匹配的模式,Django会返回404错误。

就好比下面的URLconf顺序就很重要

图片

路由系统的最佳实践

Django 的路由系统使用方法简洁且容易理解,这大大降低了如何配置 URL 的难度。在使用Django的路由系统时,我们可以遵循以下最佳实践:

  • 尽量保持简洁:遵循"显式胜于隐式"的原则,保持路由配置简洁明了。避免使用过于复杂的正则表达式,以免影响可读性和维护性。

  • 使用命名URL:使用命名URL能够提高代码可读性和维护性。命名URL可以方便地在模板中生成对应的URL,而不需要手动拼接URL。

  • 路由的锚定和分组:通过锚定和分组,能够更好地组织和管理URL模式。可以根据功能或模块对URL模式进行分组,以便更好地组织和管理路由配置。

除了基本的路由匹配功能外,Django的路由系统还提供了一些高级应用:

  • 路由的嵌套与包含关系:可以实现不同级别的URL嵌套和模块化的路由配置。可以将一组相关的URL模式放在一个应用程序的子路由配置中,然后通过主路由配置将其包含进来。

  • 匹配HTTP方法:可以根据请求的HTTP方法匹配不同的视图处理函数。可以使用path函数的methods参数来指定视图处理函数对应的HTTP方法。

from django.urls import pathfrom . import views
urlpatterns = [    path('article/', views.ArticleListView.as_view(), name='article_list'),    path('article/<int:pk>/', views.ArticleDetailView.as_view(), name='article_detail'),]

在上面的例子中,我们使用基于类的视图ArticleListView和ArticleDetailView来处理不同的HTTP方法。

path()、re_path()与url()函数

在Django 2.0版本中,引入了path()函数和re_path()函数作为新的路由配置方式, 进一步提升了Django的效率与使用的简洁性。

可以将re_path()简单的理解为等同于 1.0 版本的 url 正则匹配方法,而path()有其特定的使用方法。

url模式可以是一个字符串,也可以是一个正则表达式。字符串模式可以直接匹配URL路径,而正则表达式模式可以更灵活地匹配url。1.0 版本的url用法仍然可以在2.0版本中使用,但这种url的方法在4.2上就无法使用了。

1. path()函数

path()函数提供了一种简洁、直观的方式来定义URL模式和视图函数之间的映射关系。

path()函数是Django 2.0版本引入的新路由配置方式。它的作用是根据URL模式匹配请求的URL(将URL模式和视图函数绑定在一起),并将请求转发给相应的视图函数,Django会调用对应的视图函数进行处理。

path()函数的特点如下:

  • 使用简单的字符串模式匹配URL,不需要使用正则表达式。

  • 支持命名URL,可以为URL模式设置名称,方便在模板中生成URL。

  • 可以传递参数给视图函数,参数可以通过URL模式中的占位符进行传递。

path()函数的用法非常简单,它接受两个参数:第一个参数是URL模式,第二个参数是对应的视图函数。

示例代码如下:

from django.urls import pathfrom . import views
urlpatterns = [    path('home/', views.home, name='home'),    path('article/<int:id>/', views.article, name='article'),]

在上面的例子中,我们定义了两个URL模式。第一个模式是/home/,当用户请求这个URL时,Django会调用views.home函数进行处理。第二个模式是/article/<int:id>/,其中<int:id>表示一个参数,当用户请求类似/article/1/这样的URL时,Django会将1作为参数传递给views.article函数。

2. re_path()函数

re_path()函数是Django 1.11版本之前的路由配置方式。它的作用是使用正则表达式匹配URL模式,并将请求转发给相应的视图函数进行处理,提供了更灵活和强大的匹配能力。

re_path()函数的特点如下:

  • 使用正则表达式来匹配URL模式,可以实现更灵活的匹配规则。

  • 支持命名组,可以从URL中提取参数,并传递给视图函数进行处理。

re_path()函数的用法与path()函数类似,但是它接受的URL模式是一个正则表达式。

示例代码如下:

from django.urls import re_pathfrom . import views
urlpatterns = [    re_path(r'^article/$', views.article_list),    re_path(r'^article/(?P<id>\d+)/$', views.article_detail),]

在上面的例子中,我们使用正则表达式来匹配URL模式。'^article/$'表示匹配/article/这个URL,'^article/(?P<id>\d+)/$'表示匹配/article/1/这样的URL,并将1作为参数传递给views.article_detail函数。

re_path()函数的灵活性在于可以使用正则表达式来处理更复杂的URL模式,例如带有多个参数或者使用特殊字符的URL。

3. url()函数

url()函数是Django早期版本的路由配置方式,现在已经不推荐使用。它的作用和re_path()函数类似,使用正则表达式匹配URL模式,并将请求转发给相应的视图函数进行处理。

url()函数的特点如下:

  • 使用正则表达式来匹配URL模式。

  • 使用命名组来传递参数,通过命名组可以从URL中提取参数,并传递给视图函数进行处理。

下面我们对低版本的路由的语法格进行简单说明:

url(regex,view,name=None)

参数:

  • regex:匹配请求路径,用正则表达式表示;

  • view:指定 regex 匹配路径所对应的视图函数的名称;

  • name:是给 url 地址起个别名,在模板反向解析的时候使用,这个知识点我将在后面的模板知识点处也有做介绍。

示例代码如下:

from django.conf.urls import urlfrom . import views
urlpatterns = [    url(r'^article/$', views.article_list),    url(r'^article/(?P<id>\d+)/$', views.article_detail),]

在上面的例子中,'^article/$'和'^article/(?P<id>\d+)/$'都是正则表达式,它们分别匹配/article/和/article/1/这样的URL。使用命名组可以将参数传递给视图函数。

更多关于Django的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

path()、re_path()和url()函数之间的区别和适用场景

这几个函数都是Django的路由配置方式。

url()函数是Django早期版本的路由配置方式,它也使用正则表达式来匹配URL模式。url()函数在新版本中已经被path()和re_path()函数取代,但在一些旧的项目中仍然可以使用。

re_path()函数是Django 1.11版本之前的路由配置方式,它使用正则表达式来匹配URL模式,提供了更灵活和强大的匹配能力。如果需要处理复杂的URL模式,可以使用re_path()函数。

path()函数是Django 2.0版本引入的新路由配置方式,它提供了一种简洁、直观的方式来定义URL模式和视图函数的映射关系。官方推荐使用path()函数来配置路由,因为它更易读、易维护。

总结

Django的路由系统是构建Web应用程序的重要组成部分。通过URLconf的配置,我们可以定义URL模式和相应的视图函数或处理程序。URL模式使用正则表达式来匹配URL的不同部分,并且可以包含URL参数。URL名称和反向解析可以帮助我们在代码中引用URL,而不是直接写入URL字符串。通过使用include函数,我们可以嵌套其他URLconf,以提高代码的可维护性和可重用性。

希望本文对你理解和应用Django的路由系统有所帮助。通过熟练掌握路由系统,你将能够更好地构建和管理Django项目中的URL映射关系。祝你在使用Django开发Web应用程序时取得成功!

Python专栏
https://blog.csdn.net/zhouruifu2015/category_5742543

更多精彩,关注我公号,一起学习、成长

公众号:CTO Plus

一个有深度和广度的技术圈,技术总结、分享与交流,我们一起学习。 涉及网络安全、C/C++、Python、Go、大前端、云原生、SRE、SDL、DevSecOps、数据库、中间件、FPGA、架构设计等大厂技术。 每天早上8点10分准时发文。

306篇原创内容

Django推荐阅读:

代码规范和扫描推荐阅读:

推荐阅读:

最后,不少粉丝后台留言问加技术交流群,之前也一直没弄,所以为满足粉丝需求,现建立了一个关于Python相关的技术交流群,加群验证方式必须为本公众号的粉丝,群号如下:

图片

  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SteveRocket

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值