Django基础知识 URL路由系统详解

Django基础知识:URL路由系统详解

一、URL路由系统简介

在Django中,URL路由系统是用于匹配URL并将请求分发给适当的视图函数的机制,它可以让我们轻松地将不同的请求分发到不同的视图函数中,从而实现动态路由和URL处理。

URL路由系统有以下几个重要的组件:

  1. urls.py:路由器的配置文件,用于指定将URL映射到处理请求逻辑的视图函数。
  2. re_path() 或 path() 函数:用于路由URL,匹配请求并将其发送到相应的视图函数。
  3. 参数捕获:使用正则表达式从URL中提取参数,并将其作为参数传递给视图函数。
  4. 反向解析:使用URL名称生成URL。

下面将详细介绍URL路由系统的实现方法。

二、路由器配置

在Django中,路由器的配置文件是 urls.py 文件,我们需要在这个文件中定义URL路由规则,并将请求通过路由器分配到指定的视图函数中。

在 urls.py 文件中,我们需要导入 Django 的 path() 或 re_path() 函数,它们用于定义 URL 地址的规则,并指定将请求发送给哪些视图函数进行处理。

对于 path() 函数,其使用方法如下:

from django.urls import path
from . import views

urlpatterns = [
    path('home/', views.home), # 将URL /home/路由到视图函数views.home
]

对于 re_path() 函数,其使用方法如下:

from django.urls import re_path
from . import views

urlpatterns = [
   re_path(r'^articles/([0-9]+)/$', views.article_detail), # 将URL /articles/<id>/路由到视图函数views.article_detail
]

三、参数捕获

很多时候,URL 中包含有一些需要作为参数传递给视图函数的动态部分。例如,在URL /articles/123/ 中,123 这个部分就是动态的,我们需要从中提取出文章的 id 来找到对应的文章。在Django中,可以通过使用正则表达式来进行参数捕获。

具体做法是,在URL中使用括号包括住需要捕获的参数,然后在视图函数中使用同名参数来接收捕获到的值。

示例代码如下:

from django.urls import re_path
from . import views

urlpatterns = [
   re_path(r'^articles/(?P<article_id>[0-9]+)/$', views.article_detail), # 使用正则表达式捕获文章id
]

在视图函数中,我们可以使用相同的参数名 article_id 来接收该参数:

def article_detail(request, article_id):
    pass # TODO: 根据文章id查询并返回对应的文章

四、反向解析

反向解析是一个十分重要的概念,它可以让我们在使用 URL 路由系统时更加灵活和方便。

在 Django 中,反向解析是指使用 URL 名称来生成 URL。这样做的好处是,如果我们需要修改 URL 或者将 URL 改变成动态 URL,不需要对整个工程进行全面改动,只需要对路由器中的 URL 名称进行修改即可。这样的修改点往往只有一处,极大地方便了我们的维护。

在视图函数中,我们可以使用 reverse() 函数来进行反向解析,该函数的使用方法如下:

from django.urls import reverse
from django.http import HttpResponseRedirect

def article_create(request):
    # 创建新文章的逻辑
    return HttpResponseRedirect(reverse('article_detail', args=(article_id,)))

在上述代码中,我们使用了 reverse() 函数来生成名为 article_detail 的 URL,然后将文章的 id 作为参数传递给这个 URL,最终跳转到对应的文章详情页面。

五、示例说明

下面通过两个示例,来具体说明URL路由系统的应用方法。

  1. 示例1:实现一个简单的blog网站

我们需要实现以下几个页面:

  • 首页:显示最新的10篇文章,在标题旁边显示发布时间和作者名字;
  • 文章详情页:展示文章详细内容,包括标题、时间、作者和正文;
  • 作者主页:显示该作者发表的所有文章以及文章的发布时间和阅读次数;
  • 归档页:将所有文章按照时间归档,每年一栏,并按照时间从新到旧的方式排列;
  • 关于页面:简单介绍该网站的信息及作者的信息;

在路由器的配置文件 urls.py 文件中,我们可以这样进行配置:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'), # 首页
    path('article/<int:article_id>/', views.article_detail, name='article_detail'), # 文章详情页
    path('author/<str:author_name>/', views.author, name='author'), # 作者主页
    path('archive/', views.archive, name='archive'), # 归档页
    path('about/', views.about, name='about'), # 关于页
]

在上述代码中,我们通过 path() 函数将每个URL路由到相应的视图函数中,并且使用了不同的参数类型来捕获参数。我们还为每个 URL 添加了一个名称,方便进行反向解析。

index() 函数示例代码如下:

def index(request):
    latest_articles = Articles.objects.order_by('-pub_date')[:10] # 查询最新的10篇文章
    context = {'latest_articles': latest_articles}
    return render(request, 'blog/index.html', context)

在上述代码中,我们首先使用 Django 的 ORM 进行查询,获取到最新的 10 篇文章,并将查询结果传递给模板。

article_detail() 函数示例代码如下:

def article_detail(request, article_id):
    article = get_object_or_404(Articles, pk=article_id) # 使用 Django 的 get_object_or_404 方法获取到文章对象
    return render(request, 'blog/article.html', {'article': article})

在上述代码中,我们首先使用 get_object_or_404() 函数获取到对应的文章对象,并将结果传递给模板。

author() 函数示例代码如下:

def author(request, author_name):
    author = get_object_or_404(Author, name=author_name)
    return render(request, 'blog/author.html', {'author': author})

在上述代码中,我们使用 get_object_or_404() 函数获取到对应的作者对象,并将结果传递给模板。

archive() 函数示例代码如下:

def archive(request):
    articles = Articles.objects.order_by('-pub_date')
    year_list = set(i.pub_date.year for i in articles)
    archive = {}
    for year in year_list:
        archive[year] = []
        for article in articles:
            if article.pub_date.year == year:
                archive[year].append(article)
    return render(request, 'blog/archive.html', {'archive': archive})

在上述代码中,我们通过查询所有文章,并将年份作为 key 建立起一个字典,用来按照年份对文章进行归档,最后将这个字典传递给模板。

about() 函数示例代码如下:

def about(request):
    return render(request, 'blog/about.html')

在上述代码中,我们将一个静态的 HTML 页面作为返回结果。

  1. 示例2:实现一个简单的账户系统

我们需要实现以下几个页面:

  • 注册页:允许用户进行注册,需要验证邮箱、密码等信息;
  • 登录页:允许用户进行登录,需要验证邮箱、密码等信息;
  • 忘记密码页:允许用户进行邮箱验证,以重置密码;
  • 用户中心页:展示用户的一些基本信息以及用户的状态和相关资料;
  • 修改密码页:允许用户修改已有密码;

在路由器的配置文件 urls.py 文件中,我们可以这样进行配置:

from django.urls import path
from . import views

urlpatterns = [
    path('signup/', views.signup, name='signup'), # 注册页
    path('login/', views.login, name='login'), # 登录页
    path('forgot_password/', views.forgot_password, name='forgot_password'), # 忘记密码页
    path('user/<int:user_id>/', views.user_center, name='user_center'), # 用户中心页
    path('user/<int:user_id>/change_password/', views.change_password, name='change_password'), # 修改密码页
]

在上述代码中,我们分别将每个URL路由到相应的视图函数中,并且使用了不同的参数类型来捕获参数。我们还为每个 URL 添加了一个名称,方便进行反向解析。

signup() 函数示例代码如下:

def signup(request):
    if request.method == 'POST':
        form = SignupForm(request.POST)
        if form.is_valid():
            # 注册成功后的逻辑
            return HttpResponseRedirect(reverse('user_center', args=(user_id,)))
    else:
        form = SignupForm()
    return render(request, 'accounts/signup.html', {'form': form})

在上述代码中,我们首先判断请求方式是否为 POST,并使用 Django 的表单处理,验证表单的数据是否合法。如果表单数据合法,我们将进行注册成功后的逻辑。

login() 函数示例代码如下:

def login(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            # 登录成功后的逻辑
            return HttpResponseRedirect(reverse('user_center', args=(user_id,)))
    else:
        form = LoginForm()
    return render(request, 'accounts/login.html', {'form': form})

在上述代码中,我们同样使用了 Django 的表单处理,验证表单的数据是否合法。如果表单数据合法,我们将进行登录成功后的逻辑。

forgot_password() 函数示例代码如下:

def forgot_password(request):
    if request.method == 'POST':
        form = ForgotPasswordForm(request.POST)
        if form.is_valid():
            # 发送邮件验证后的逻辑
    else:
        form = ForgotPasswordForm()
    return render(request, 'accounts/forgot_password.html', {'form': form})

在上述代码中,我们同样使用了 Django 的表单处理,验证表单的数据是否合法。如果表单数据合法,我们将发送邮件进行验证,并进行验证成功后的逻辑。

user_center() 函数示例代码如下:

def user_center(request, user_id):
    user = get_object_or_404(User, pk=user_id)
    return render(request, 'accounts/user_center.html', {'user': user})

在上述代码中,我们通过 get_object_or_404() 方法获取到对应的用户对象,并将其传递给模板。

change_password() 函数示例代码如下:

def change_password(request, user_id):
    user = get_object_or_404(User, pk=user_id)
    if request.method == 'POST':
        form = ChangePasswordForm(request.POST)
        if form.is_valid():
            # 修改密码逻辑
            return HttpResponseRedirect(reverse('user_center', args=(user_id,)))
    else:
        form = ChangePasswordForm()
    return render(request, 'accounts/change_password.html', {'form': form})

在上述代码中,我们同样使用了 Django 的表单处理,验证表单的数据是否合法。如果表单数据合法,我们将进行修改密码的逻辑。

六、总结

在本文中,我们介绍了 Django URL 路由系统的基础知识,包括路由器的配置、参数捕获和反向解析等知识点,并通过两个示例说明了这些知识点的具体应用。希望通过本文的学习,大家能够初步掌握 Django URL 路由系统的使用方法,为实际项目的开发打下坚实基础。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django基础知识 URL路由系统详解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 快速上手基于Anaconda搭建Django环境的教程

    下面是“快速上手基于Anaconda搭建Django环境的教程”的完整攻略: 安装Anaconda 首先,需要安装Anaconda,Anaconda 是一个 Python 集成环境,包含了许多科学计算和数据分析常用的库,而且安装非常方便。 可以去 Anaconda 官网下载对应操作系统的安装包,然后双击安装,一路按照提示进行即可。 创建Anaconda虚拟环…

    Django 2023年5月16日
    00
  • Django实现简单的分页功能

    下面是Django实现简单的分页功能的完整攻略: 安装Django框架 在开始之前,首先需要安装Django框架。在命令行中输入以下命令即可: pip install Django 创建Django项目 在安装完成Django框架之后,使用下面的命令创建一个Django项目: django-admin startproject myproject 这将创建一…

    Django 2023年5月16日
    00
  • Python Django实现个人博客系统的搭建

    Python Django实现个人博客系统的搭建攻略 简介 Python的Django框架在web开发中应用广泛,本文将介绍如何使用Django框架搭建个人博客系统。该博客系统除常见博客功能外,还包含用户身份验证,文章归档,评论系统等功能。 必要的工具及技能 在开始搭建博客系统前,需要准备好以下工具及技能: Python3.x Django HTML,CSS…

    Django 2023年5月16日
    00
  • Django-利用paginator模块实现分页

    Django专门提供了一个paginator模块,实现分页很easy。 下面的例子引用了django官方文档:https://docs.djangoproject.com/en/1.11/topics/pagination/ Paginator实例化需要2个参数,一个是待分页的对象list(需要实现count方法或者__len__方法),另一个是每页数量。 …

    Django 2023年4月10日
    00
  • [django]django model的查询和更新

    再分享Django系列的另外几篇文章:Django model select的各种用法详解:https://mp.weixin.qq.com/s/JVh4UnS2Tql9gUVaBSoGuADjango model update的各种用法介绍:https://mp.weixin.qq.com/s/B_aNB8Y8snbSVLURONZ4QgDjango配置C…

    Django 2023年4月10日
    00
  • Django 如何实现文件上传下载

    下面是关于Django如何实现文件上传下载的完整攻略及两条示例说明。 文件上传 1. 在模型中定义文件类型的字段 Django模型中有一个文件类型的字段(FileField),可以定义文件上传的位置以及文件存储在服务器上的名称。 示例: from django.db import models class NewFile(models.Model): tit…

    Django 2023年5月16日
    00
  • django query模块

    Django中的query模块是用于与数据库进行交互的API。它提供了一个组合查询表单的方式,可以使用查询表达式、筛选条件和聚集函数等操作数据。下面是使用query模块的完整攻略,并包含两条示例说明。 1. 查询操作 使用query模块,我们可以使用方法.objects获取数据表中的记录并进行筛选。下面举例说明: 1.1. 获取所有记录 from youra…

    Django 2023年5月16日
    00
  • Django orm 实现批量插入数据

    Django ORM 中的批量操作 在Hibenate中,通过批量提交SQL操作,部分地实现了数据库的批量操作。但在Django的ORM中的批量操作却要完美得多,真是一个惊喜。 数据模型定义 首先,定义一个实例使用的django数据库模型Product,只是象征性地定义了两个字段name和price。 from django.db import models…

    Django 2023年4月9日
    00
合作推广
合作推广
分享本页
返回顶部