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日

相关文章

  • Django项目部署搭建uWSGI工作环境

    安装uWSGI 在Linux系统中,可以使用以下命令安装uWSGI: sudo apt-get update sudo apt-get install build-essential python3-dev sudo pip3 install uwsgi 创建Django项目 使用Django创建一个新项目: django-admin startprojec…

    Django 2023年3月13日
    00
  • python + django + echart 构建中型项目

    1. python生产环境, 多层modules 导入问题:   多个modules 如何导入不同级别的包: 在每个modules下新建 __init__.pyimport os, sys dir_mytest = os.path.dirname(os.path.abspath(__file__))      # crontab 跑时 os.getcwd()…

    Django 2023年4月13日
    00
  • 使用Django2.0打造小程序助手

    打造个人助手 主角: Django2.0 微信小程序(2017年元旦发布) 技术要求: python3开发基础 Django开发基础 HTML+CSS+JS 开发环境: Python开发环境:Python3.5+pycharm 小程序开发环境:微信开发者工具 系统开发环境:Windows(开发)+linux(部署) 依赖环境&工具 Postman(模…

    Django 2023年4月9日
    00
  • Django之单表查询,多表查询(正向、反向查询),聚合查询

    常用字段 AutoField int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。 IntegerField 一个整数类型,范围在 -2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),直接用字符串存,) CharField 字符类型,必须提供max_…

    Django 2023年4月12日
    00
  • GraphQL在Django中的使用教程

    下面是关于“GraphQL在Django中的使用教程”的完整攻略,包含两条示例说明: 1. 介绍 GraphQL是一种用于API开发的查询语言和运行时。它被归类为替代REST的API解决方案之一。它具有强大的查询语言、类型安全、自动化API文档生成、动态查询、精确响应、递归查询等优点。同时,GraphQL也可以与Django集成,使用GraphQL可以在Dj…

    Django 2023年5月15日
    00
  • Django Redis验证码 密码 session 实例

    1.settings CACHES = { “default”: { “BACKEND”: “django_redis.cache.RedisCache”, “LOCATION”: “redis://192.168.8.102:6379/0”, “OPTIONS”: { “CLIENT_CLASS”: “django_redis.client.Default…

    Django 2023年4月9日
    00
  • Django+Vue打造购物网站(八)

    购物车、订单管理和远程调试 添加商品到购物车 trade/serializers.py from rest_framework import serializers from goods.models import Goods from trade.models import ShoppingCart class ShopCartSerializer(ser…

    Django 2023年4月9日
    00
  • Django REST framework 中文文档

    Django REST framework介绍 现在前后端分离的架构设计越来越流行,业界甚至出现了API优先的趋势。 显然API开发已经成为后端程序员的必备技能了,那作为Python程序员特别是把Django作为自己主要的开发框架的程序员,我十分推荐Django REST framework(DRF)这个API框架。   Django REST framew…

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