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

yizhihongxing

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日

相关文章

  • django中只使用ModleForm的表单验证,而不使用ModleForm来渲染

    主题 众所周知,django.forms极其强大,不少的框架也借鉴了这个模式,如Scrapy。在表单验证时,django.forms是一绝,也是面向对象的经典表现。但要用它来渲染表单那就不好玩了,除非写框架。本文章主要缕一缕如何使用django.forms来做表单验证。 django项目基本信息 models.py from django.db import…

    Django 2023年4月10日
    00
  • Python django框架开发发布会签到系统(web开发)

    Python Django框架是目前非常流行的Web开发框架,可以用于开发各种规模大小的Web应用,也是开发发布会签到系统的最佳选择之一。下面,我将从项目规划、环境搭建、数据库设计、模型设计、视图设计、路由设计、前端设计、测试和部署等方面详细讲解如何使用Python Django框架开发并发布会签到系统。 项目规划 在开始开发会签到系统之前,需要进行一些基础…

    Django 2023年5月16日
    00
  • 简单的Django实现图片上传,并存储进MySQL数据库 案例——小白

    目标:通过网页上传一张图片到Django后台,后台接收并存储进数据库 真是不容易!!这个案例的代码网上太乱,不适合我,自己摸索着写,终于成功了,记录一下,仅供自己参考,有的解释可能不对,自己明白就好,哈哈哈!~!~!   1.首先用pycharm创建一个Django项目,嗯,对,这是第一步~     2. 第二步呢,改一下setting.py的设置吧,数据库…

    2023年4月9日
    00
  • Django中shell命令的使用

    Django中的shell命令是一种交互式命令行工具,可以在Django应用程序的上下文中执行Python代码。使用shell命令可以方便地访问和修改Django应用程序的数据和功能。 以下是使用shell命令的完整攻略: 打开Django shell 在命令行中进入Django应用程序的根目录,然后运行以下命令: python manage.py shel…

    Django 2023年5月15日
    00
  • Django html标签make_safe

    from django.utils.safestring import mark_safe a = mark_safe(“<a href=’#’>test</a>”)  

    Django 2023年4月9日
    00
  • Django添加templates目录的方式

    Django添加templates目录的方式 1.新建templates目录 2.在settings里注册 注册的方式: 先找到TEMPLATES的列表,再在该列表中添加 ‘DIRS’: [os.path.join(BASE_DIR, ‘templates’)]

    Django 2023年4月9日
    00
  • 【Django drf】 序列化类常用字段类和字段参数 定制序列化字段的两种方式 关系表外键字段的反序列化保存 序列化类继承ModelSerializer 反序列化数据校验源码分析

    目录 序列化类常用字段类和字段参数 常用字段类 常用字段参数 选项参数 通用参数 序列化类高级用法之source source填写类中字段 source填写模型类中方法 source支持跨表查询 定制序列化字段的两种方式 准备工作 方法一:使用SerializerMethodField 方法二:在模型类中写方法 关系表外键字段的反序列化保存 前端提交的数据 …

    Django 2023年4月13日
    00
  • django shell的基本使用

    作者:python技术人博客:https://www.cnblogs.com/lpdeboke/在日常工作再发中,经常需要测试一些对象、函数、类…等是否正确,但是如果整体运行项目特别麻烦,并且不好定位错误,此时我们就可以使用python shell进行测试。如果要测试django相关的一些模块,比如models,引了模块非常繁琐,所以django 自带了…

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