1. 背景介绍
在 Python 的 Web 开发中,框架是事半功倍的利器之一。而 Django 做为红极一时的 Python Web 框架,具有开发迅速、功能强大等优良特性,因此备受开发者们的喜爱。
在 Django 的架构中,路由是一个十分重要的组成部分,它作为 Django 接受请求的一种方式,主要用于将 URL 请求转发到相应的视图函数,实现具体的业务逻辑。
2. 路由介绍
2.1 urlpatterns
Django 的路由系统是在 urls.py 文件中配置的,最常用的方法就是通过 urlpatterns 列表来配置路由。这个列表是在项目的 urls.py 文件中定义的。
样例如下:
from django.urls import path
from . import views
urlpatterns = [
path('articles//', views.year_archive),
path('articles///', views.month_archive),
path('articles////', views.article_detail),
]
从上面的代码中可以看出,urlpatterns 列表中每个元素都是一个 path() 函数调用,这个函数有两个参数:
第一个参数是 URL 规则,可以使用正则表达式。
第二个参数是对应视图函数。
其中,第二个参数 views.year_archive、views.month_archive 和 views.article_detail 就是对应的视图函数。
2.2 path()
path() 函数是 Django 中最常用的路由函数之一,它用于将一个 URL 规则与一个视图函数建立绑定关系。
path() 函数的基本语法格式如下:
path(route, view, kwargs=None, name=None)
参数说明:
route:字符串类型的 URL 规则。开头不需要加斜杆。
view:视图函数。当 route 中的规则匹配时,会调用此函数处理请求。
kwargs:一个字典类型参数,包含任意数目的关键字参数用于向视图传递额外的参数。
name:给 URL 起一个名字,以便在 Django 的其他部分中进行引用。
示例:
from django.urls import path
from . import views
urlpatterns = [
path('articles//', views.year_archive),
]
这个 URL 规则的含义是:以 articles/ 开头,后面跟着一个表示文章年份的整数(year),最后以斜杆(/)结尾。
2.3 re_path()
re_path() 函数与 path() 函数非常相似,但是它支持使用正则表达式进行 URL 规则匹配。
re_path() 函数的基本语法格式如下:
re_path(route, view, kwargs=None, name=None)
参数说明:
route:字符串类型的 URL 规则。必须使用正则表达式。
view:视图函数。当 route 中的规则匹配时,会调用此函数处理请求。
kwargs:一个字典类型参数,包含任意数目的关键字参数用于向视图传递额外的参数。
name:给 URL 起一个名字,以便在 Django 的其他部分中进行引用。
示例:
from django.urls import re_path
from . import views
urlpatterns = [
re_path(r'^articles/(?P<year>\d{4})/$', views.year_archive),
]
这个 URL 规则的含义是:以 articles/ 开头,后面跟着一个 4 位的整数(表示年份,使用 (?P<year>…) 捕获为 year 参数),最后以斜杆(/)结尾。
3. 路由命名
Django 路由系统中的每个 URL 都可以指定一个名字,它可让我们在代码的其它地方直接调用 URL 而不必硬编码(hard code)它。
定义 URL 命名的方式是给 path() 或 re_path() 函数的 name 参数传递一个字符串,例如:
from django.urls import path
from . import views
urlpatterns = [
path('articles//', views.year_archive, name='year_archive'),
]
这个 URL 命名为 “year_archive”。
要在代码中调用它,只需要使用 reverse() 函数,例如:
from django.urls import reverse
url = reverse('year_archive', args=(2021,))
其中,reverse 函数的第一个参数是 url 名称,args 参数是一个可迭代对象,它包含对应 url 中的参数。
4. include() 函数
include() 函数用于包含其它的 URL 配置模块。这个函数的作用是将子路由映射到项目的根路由,使得应用更加模块化。
示例:
from django.urls import include, path
urlpatterns = [
path('blog/', include('myblog.urls')),
]
这个例子把以 /blog/ 开头的请求都转到 myblog.urls 模块中进行处理。
5. 总结
本文主要介绍了 Django 路由的相关知识,包括 urlpatterns、path()、re_path()、路由命名及 include() 函数。
小心使用 urlpatterns 配置路由,与多个 urls.py 模块分离路由,内容清晰易维护。