[Python]Django 路由

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: [Python]Django 路由

项目名称为 django_project_1,项目中具有一个子应用 index。

1. 项目路由配置文件

由于在项目的全局配置文件 settings.py 中,通过配置项 ROOT_URLCONF = 'django_project_1.urls' 指定项目的路由配置文件为 django_project_1/urls.py,所以整个项目的根路由在 django_project_1/urls.py 文件中。

from django.contrib import admin
from django.urls import path
urlpatterns = [
  # 项目会默认配置一个admin路由用于进入项目自带的管理后台
    path('admin/', admin.site.urls),
]

2. 配置路由

2.1 path()

使用 path() 函数进行路由规则的配置,一个 path() 函数对应一个路由规则。

语法:

path('url表达式', 视图函数, 别名)

使用 url() 函数配置路由规则,是 django1.x 中的用法,django2.x 和 django3.x 向下兼容,在 django2.x 和 django3.x 中也可以使用 url() 函数配置路由规则。

2.2 一般路由规则的配置

当用户访问 index/ 时,调用子应用 index 中相应的视图函数 index 进行请求的处理与响应。

from django.contrib import admin
from django.urls import path
# 导入 index 子应用的视图
from index import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index)
]

index/views.py:

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
    return HttpResponse('index')

2.3 命名路由的配置

在配置路由规则时,可以为路由命名,即为路由取别名,在后序如果需要使用路由且路由过长时,可以使用路由的别名进行反解析将路由解析出来使用,这样子避免书写过长的路由。

from django.contrib import admin
from django.urls import path
# 导入 index 子应用的视图
from index import views
urlpatterns = [
    path('admin/', admin.site.urls),
    # 通过向 path() 函数中传入 name 参数为路由命名
    path('index/', views.index, name='index')
]

2.4 反向解析路由

通过 reverse() 函数可以根据路由的命名反向解析出路由。

语法:

reverse('路由的命名')

index/views.py:

from django.shortcuts import render
from django.http import HttpResponse
# 导入反解析函数
from django.urls import reverse
# Create your views here.
def index(request):
    return HttpResponse(reverse('index'))

2.5 子路由的配置

为了能够同一管理项目中不同子应用的路由,我们可以为每个子应用配置子路由,将同一个子应用中的路由都写在一起,同时这样子也可以避免所有的路由配置都写在项目路由配置文件中造成项目路由配置文件臃肿。

在子应用对应的目录下新建子应用路由配置文件:

在项目路由配置文件中使用 include() 函数配置子路由:

include() 函数需要传入一个参数,该参数为子应用的路由配置文件。

from django.contrib import admin
from django.urls import path,include
# 导入 index 子应用的视图
from index import views
urlpatterns = [
    path('admin/', admin.site.urls),
    # path('index/', views.index, name='index')
    path('index/', include('index.urls'))
]

在子应用的路由配置文件 index/urls.py 中,配置子应用的路由:

from django.urls import path,include
# 导入 index 子应用的视图
from index import views
urlpatterns = [
    path('index_page/', views.index, name='index_page')
]

index/view.py

from django.shortcuts import render
from django.http import HttpResponse
# 导入反解析函数
from django.urls import reverse
# Create your views here.
def index(request):
    return HttpResponse('index首页')

2.6 为子路由命名(命名空间)

在使用include函数定义子路由时,可以使用namespace参数定义子路由的命名空间。命名空间表示,凡是在子应用路由配置文件中定义的路由,均属于namespace指定的名下。

命名空间的作用:避免不同子应用中的路由使用了相同的名字发生冲突,使用命名空间区别开。

from django.contrib import admin
from django.urls import path,include
# 导入 index 子应用的视图
from index import views
urlpatterns = [
    path('admin/', admin.site.urls),
    # path('index/', views.index, name='index')
    # path('index/', include('index.urls'))
    # 注意:定义了命名空间,include第一个参数数据类型必须设置为元组类型,
    # 且元组需要包含两个元素,第一个元素为'子应用名.urls',第二个元素为'子应用名'
    # include第二个参数为命名空间
    # 子应用路由的命名空间名通常为子应用名
    path('index/', include(('index.urls', 'index'), namespace='index'))
]

指定了命名空间后,通过reverse函数反解析获取路由需要使用命名空间:路由名

from django.shortcuts import render
from django.http import HttpResponse
# 导入反解析函数
from django.urls import reverse
# Create your views here.
def index(request):
    return HttpResponse(reverse('index:index_page'))

2.7 带参路由的配置

需要通过路由向服务器传递参数,在路由配置时,需要在路由中使用 <参数数据类型:参数名称> 的写法。

路由中参数的数据类型有4种:

1.str:任意非空字符串,不包含’/’,默认类型

2.int:匹配0和正整数

3.slug:匹配任何ASCII字符、连接符、下划线

4.uuid:匹配一个UUID格式字符串,该对象必须包括’-’,所有的字母必须小写。如22221111-abcd-3cww-3321-123456789012

配置带参路由:

index/urls.py

from django.urls import path,include
# 导入 index 子应用的视图
from index import views
urlpatterns = [
    path('index_page/', views.index, name='index_page'),
    path('show/<int:id>/<str:username>/', views.show, name='show')
]

在路由对应的处理函数中,要接收通过URL传递过来的参数,需要在处理函数的形参列表中声明相应的形参,且参数名称要和路由中的参数名称保持一致。

index/views.py

def show(request, id, username):
    return HttpResponse(f'{id}: {username}')

2.8 使用正则匹配URL中的参数

re_path() 函数与 path() 函数的作用一样,但是 re_path() 函数在编写路由时可以使用正则表达式。

路由中正则表达式的语法:

(?P<name>pattern)
name:为参数名
pattern:为正则匹配模式

常见正则:

1..:匹配任意单个字符

2.\d:匹配任意一个数字

3.\w:匹配字母、数字、下划线

4.*:匹配0个或多个字符,\d* 表示匹配0个或多个数字

5.[a-z]:匹配a-z中任意一个字母

6.{1,5}:匹配1-5个字符

配置正则带参路由:

index/urls.py

from django.urls import path, include,re_path
# 导入 index 子应用的视图
from index import views
urlpatterns = [
    path('index_page/', views.index, name='index_page'),
    path('show/<int:id>/<str:username>/', views.show, name='show'),
    # 包含正则的路由字符串前需要加 r
    # 正则匹配部分需要()
    re_path(r'show/book/(?P<book_id>\d{4})/', views.show_book, name='show_book'),
]

路由对应的处理函数:

index/views.py

def show_book(request, book_id):
    return HttpResponse(f'书本编号:{book_id}')

相关文章
|
1月前
|
前端开发 JavaScript UED
探索Python Django中的WebSocket集成:为前后端分离应用添加实时通信功能
通过在Django项目中集成Channels和WebSocket,我们能够为前后端分离的应用添加实时通信功能,实现诸如在线聊天、实时数据更新等交互式场景。这不仅增强了应用的功能性,也提升了用户体验。随着实时Web应用的日益普及,掌握Django Channels和WebSocket的集成将为开发者开启新的可能性,推动Web应用的发展迈向更高层次的实时性和交互性。
78 1
|
23天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
125 45
|
11天前
|
Python
Django 框架的路由系统
Django 框架的路由系统
31 6
|
24天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
35 2
|
27天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
38 1
|
1月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
30 4
|
1月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【10月更文挑战第10天】本文比较了Python中三个最受欢迎的Web框架:Django、Flask和Pyramid。Django以功能全面、文档完善著称,适合快速开发;Flask轻量灵活,易于上手;Pyramid介于两者之间,兼顾灵活性和安全性。选择框架时需考虑项目需求和个人偏好。
36 1
|
1月前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【10月更文挑战第6天】本文比较了Python中三个最受欢迎的Web框架:Django、Flask和Pyramid。Django功能全面,适合快速开发;Flask灵活轻量,易于上手;Pyramid介于两者之间,兼顾灵活性和可扩展性。文章分析了各框架的优缺点,帮助开发者根据项目需求和个人偏好做出合适的选择。
36 4
|
2月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
95 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
1月前
|
存储 Shell 数据库
Python编程--Django入门:用户账户(二)
Python编程--Django入门:用户账户(二)
下一篇
无影云桌面