[Python]Django 路由

简介: [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月前
|
监控 安全 应用服务中间件
python中Django入门(四)
python中Django入门(四)
31 0
|
19天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【4月更文挑战第9天】本文对比了Python三大Web框架Django、Flask和Pyramid。Django功能全面,适合快速开发,但学习曲线较陡;Flask轻量灵活,易于入门,但默认配置简单,需自行添加功能;Pyramid兼顾灵活性和可扩展性,适合不同规模项目,但社区及资源相对较少。选择框架应考虑项目需求和开发者偏好。
|
11天前
|
Python
基于Django的Python应用—学习笔记—功能完善
基于Django的Python应用—学习笔记—功能完善
|
25天前
|
前端开发 测试技术 数据库
【python】为什么使用python Django开发网站这么火?
【python】为什么使用python Django开发网站这么火?
|
1月前
|
中间件 数据安全/隐私保护 Python
python中Django入门(三)
python中Django入门(三)
17 0
|
1月前
|
前端开发 JavaScript Shell
python中Django入门(二)
python中Django入门(二)
14 0
|
1月前
|
SQL Shell 数据库
python中Django入门(一)
python中Django入门(一)
28 0
|
1月前
|
设计模式 前端开发 数据库
Django是一个用Python编写的开源Web应用框架
Django是一个用Python编写的开源Web应用框架
13 1
|
1月前
|
数据采集 存储 数据处理
Python爬虫在Django项目中的数据处理与展示实例
Python爬虫在Django项目中的数据处理与展示实例
|
1月前
|
开发框架 人工智能 前端开发
使用Python、Django和Bootstrap构建在线教育平台
使用Python、Django和Bootstrap构建在线教育平台
40 0