下面是Python Django基础二之URL路由系统的完整攻略。
1. 什么是URL路由系统
在Django中,URL路由系统就像是一个分配任务的调度员,当用户访问某个URL时,它会把这个请求分发给相应的视图函数进行处理。URL路由系统被设计得非常灵活,可以支持各种不同的URL格式。
2. URL路由系统的配置
Django中的URL路由系统的配置是在urls.py
文件中进行的,它位于每个应用程序的根目录下。我们需要在该文件中定义所有的URL规则。
一个典型的urls.py
的文件包含三部分:
from django.urls import path
from . import views
urlpatterns = [
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]
在这个示例中,我们为三个不同的URL规则定义了三个视图函数。这些规则会将请求分配给相应的视图函数进行处理。这些规则也被称为URL模式。
3. URL模式的语法
在Django的URL路由系统中,我们使用path
函数为URL模式进行定义,其语法格式如下:
path(route, view, kwargs=None, name=None)
具体的参数含义如下:
- route:字符串类型,表示URL模式的匹配规则;
- view:表示要执行的视图函数;
- kwargs:字典类型,表示将传递给视图函数的关键字参数;
- name:URL模式的名称,可以在代码中用于反向查找URL。
下面是一些常见的URL模式示例:
# 匹配以空白字符结尾的URL
path('foo/bar/ ', views.bar),
# 匹配含有参数的URL
path('articles/<int:year>/<slug:slug>/', views.article_detail),
# 匹配重定向到另一个URL
path('', RedirectView.as_view(url='/foo/bar/'), name='index'),
# 匹配URL转发到另一个应用程序
path('blog/', include('blog.urls')),
4. URL命名空间
URL命名空间指的是将URL模式分组成不同的模块,这样可以使得我们的代码更加结构化和模块化。
可以使用app_name
来为URL模块定义命名空间。例如:
# blog/urls.py
from django.urls import path
from . import views
app_name = 'blog'
urlpatterns = [
path('', views.index, name='index'),
path('<int:pk>/', views.detail, name='detail'),
path('archive/', views.archive, name='archive'),
]
在这个示例中,我们将所有的URL模式分组到一个叫做blog
的命名空间下。这样在其他的地方可以通过blog:index
来引用这个URL模式,这就是反向查找URL的一个用法。
5. 示例说明
下面是两个示例说明:
示例1: 动态路由参数
在这个示例中,我们来学习如何使用动态路由参数,这个功能可以方便地对用户请求中带有动态参数的URL进行处理。
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('<int:year>/<int:month>/<int:day>/', views.date_archive),
]
这个路由配置规则匹配一个三部分(年份、月份、日期)的数字参数,然后将其作为参数传递给视图函数。下面是视图函数的实现:
# views.py
from django.shortcuts import render
def date_archive(request, year, month, day):
context = {
'year': year,
'month': month,
'day': day,
}
return render(request, 'date_archive.html', context)
在这里,我们创建了一个包含三个变量(year, month和day)的上下文变量,并将其传递给模板进行渲染。
最后,我们需要在模板中进行渲染:
<!-- date_archive.html -->
<h1>{{ year }}年{{ month }}月{{ day }}日</h1>
访问URL,例如/foo/2020/12/31/,将会正确的显示想要的内容。
示例2: URL反向解析
在Django中,我们可以使用reverse()
函数来对某个URL模式进行反向解析。这个功能非常有用,因为可以在不直接写URL的情况下,在代码中生成URL。
# urls.py
from django.urls import path
from . import views
app_name = 'blog'
urlpatterns = [
path('', views.index, name='index'),
path('<int:pk>/', views.detail, name='detail'),
path('archive/', views.archive, name='archive'),
]
这个示例路由配置文件包含了三个URL模式,并且使用name
参数定义了每个URL模式的名称。现在我们可以在代码中使用这些名称来生成URL。
# views.py
from django.shortcuts import render, reverse
from django.http import HttpResponseRedirect, HttpResponse
from .models import Post
def redirect_to_archive(request):
"""
重定向到post归档页面
"""
url = reverse('blog:archive')
return HttpResponseRedirect(url)
def post_detail(request, pk):
"""
显示博客文章详情
"""
post = Post.objects.get(pk=pk)
context = {
'post': post,
}
return render(request, 'blog/post_detail.html', context)
def post_list(request):
"""
显示所有的博客文章
"""
posts = Post.objects.all()
context = {
'posts': posts,
}
return render(request, 'blog/post_list.html', context)
在这里,我们使用了reverse()
函数来生成URL。reverse()
函数需要指定包含URL名称的命名空间(<app_name>:<url_name>)
,例如blog:index
。这样就可以生成包含应用程序名称和URL名称的URL。
在这里,我们还使用redirect()
函数来重定向到post归档页面。在这个重定向中,我们使用了reverse()
函数来生成URL。这是一个非常流行的编程模式,因为可以确保我们使用的是正确的URL。
以上就是Python Django基础二之URL路由系统的完整攻略,希望对你有帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python Django基础二之URL路由系统 - Python技术站