Django框架-5

路由系统

通过URL(Uniform Resource Locator,统一资源定位符)可以访问互联网上的资源——用户通过
浏览器向指定URL发起请求,Web服务器接收请求并返回用户请求的资源,因此可以将URL视为用户与服务器之间交互的桥梁。

在Django当中,路由系统的本质就是URL与要调用URL的视图函数的一个映射表,它的主要作用就
是让views里面的执行函数与请求的url建立映射关系,当请求来了的时候根据这个url映射来调用对应的
执行函数,从而返回给客户端相应的信息

Django处理请求的流程

当用户向你的Django站点请求一个页面时,系统会采用一个算法来确定要执行哪一段Python代码:

  1. 首先,Django会使用根路由解析模块(root URLconf)来解析路由。

  2. Django加载该Python模块并查找变量 urlpatterns 。 它应该是 django.urls.path() 或者django.urls.re_path() 实例的Python列表。

  3. Django按顺序遍历每个URL pattern,并在第一个匹配的请求URL被匹配时停下。

  4. 一旦某个URL pattern成功匹配,Django会导入并调用给定的视图,该视图是一个简单的Python
    函数(或基于类的视图)。

这个视图会被传以以下参数:
一个 HttpRequest 的实例。
如果所匹配的正则表达式返回的是若干个无名组,那么该正则表达式所匹配的内容将被作为
位置参数提供给该视图。
关键字参数是由路径表达式匹配的任何指定部件组成的,在可选的 kwargs 参数中指定的任
何参数覆盖到 django.urls.path() 或 django.urls.re_path() 。

5.如果请求的URL没有匹配到任何一个表达式,或者在匹配过程的任何时刻抛出了一个异常,那么
Django 将调用适当的错误处理视图进行处理

URL配置

一个项目允许有多个urls.py,但Django需要一个urls.py作为入口,这个特殊的urls.py就是根
URLconf(根路由配置),它由settings.py文件中的ROOT_URLCONF指定

这条代码实在setting.py文件中

ROOT_URLCONF = 'mysite.urls'

以上示例通过ROOT_URLCONF指定了mysite目录下的urls.py作为根URLconf

为保证项目结构清晰,开发人员通常在Django项目的每个应用下创建urls.py文件,在其中为每个应用
配置子URL。路由系统接收到HTTP请求后,先根据请求的URL地址匹配根URLconf,找到匹配的子应用,再进一步匹配子URLconf,直到匹配完成
在这里插入图片描述

路由测试

1.创建新的项目
2.现将urls.py文件
3.views.py文件编写一个子应用

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

4.在子应用中的urls.py文件中创建子路由

from django.contrib import admin
from django.urls import path
from  urlAPPS.views import indexurlpatterns = [path('index/', index),
]

5.在总项目的路由中添加上子路由

from django.contrib import admin
from django.urls import path,includeurlpatterns = [path('admin/', admin.site.urls),path('urlAPPS/',include('urlAPPS.urls')),
]

6.在views.py文件中添加新的子应用

def special_case_2022(request):return HttpResponse('路由测试1')def year_archive(request, year):return HttpResponse(f"year_archive{year}")def month_archive(request, year, month):return HttpResponse(f"month_archive 年:{year} 月:{month}")def article_detail(request, year, month, slug):return HttpResponse(f"article_detail 年:{year} 月:{month} {slug}")

7.在子路由中添加路由地址

path('articles/2022/', views.special_case_2022),path('articles/<int:year>/', views.year_archive),path('articles/<int:year>/<int:month>/', views.month_archive),path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),

路由转换器

Django2以上内置路由转换器可以显式地指定路由中参数的数据类型,Django中内置了5种路由转
换器,分别为str、int 、slug 、uuid 和path

str:匹配任何非空字符串,但不包含路由分隔符“/”。如果URL中没有指定参数类型,默认使用该
类型。

int:匹配0或任何正整数。并作为 int 返回。

slug:匹配由字母、数字、连字符和下划线组成的URL。例如, building-your-1st-django-site

uuid:匹配一个uuid格式的字符串。为了防止多个URL映射到同一页面中,该转换器必须包含连
字符,且所有字母均为小写。例如, 075194d3-6885-417e-a8a8-6c931e272f00 . 返回一个 UUID
实例

path:匹配包含路径分隔符 ‘/’ 在内的任意非空字符串。 相对于 str ,这允许你匹配一个完整的
URL路径,而不仅仅是URL路径的一部分。

from django.contrib import admin
from django.urls import path
from urlAPPS.views import index
from urlAPPS import viewsurlpatterns = [path('index/', index),path('articles/2022/', views.special_case_2022),path('articles/<int:year>/', views.year_archive),path('articles/<int:year>/<int:month>/', views.month_archive),path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),# str字符串类型测试path('articles/<str:year>/', views.str_cs),
]

正则表达式

如果路径和转换器语法不足以定义你的URL pattern,你还可以使用正则表达式。 为了使用正则表
达式,请使用 re_path() ,而不要使用 path() 。

在Python正则表达式中,命名正则表达式组的语法是 (?Ppattern) , 这里 name 是表达式组的名字
而 pattern 是要匹配的模式。

 re_path(route, view, kwargs=None, name=None)

注意:
无论正则表达式匹配什么类型,每个捕获的参数都会以字符串形式传给视图。

正则表达式格式为:(?Ppattern),其中name表示分组名,pattern表示匹配的正则表达式。URL
匹配成功后,捕获到的参数会作为关键字参数传递给对应的视图,因此视图中的形式参数必须和正
则表达式中的分组名相同

若正则表达式只通过小括号“()”来捕获URL的参数,但未为其命名,则它是一个未命名正则表达
式,此时捕获的参数并将其以位置参数形式传递给对应视图

from django.contrib import admin
from django.urls import path , re_path
from urlAPPS.views import index
from urlAPPS import viewsurlpatterns = [# 路由转换器path('index/', index),# path('articles/2022/', views.special_case_2022),# path('articles/<int:year>/', views.year_archive),# path('articles/<int:year>/<int:month>/', views.month_archive),# path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),# str字符串类型测试# path('articles/<str:year>/', views.str_cs),# 正则表达式re_path('articles/2021/$', views.re_special_case_2022),re_path('articles/(?P<year>[0-9]{4})/$', views.re_year_archive),re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.re_month_archive),re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[-_\w]+) / $', views.re_article_detail),
]

向视图传递额外参数

path()函数、re_path()函数允许向视图传递额外参数,这些参数存放在一个字典类型的数据中,该
数据的键代表参数名,值代表参数值。re_path()函数与path()函数传递额外参数方式相同,以path()函数为例介绍如何向视图传递额外参数。

使用path()函数的第三个参数可以向视图传递额外参数

路由解析顺序

Django在接收到一个请求时,从主路由文件中的urlpatterns列表中以由上至下的顺序查找对应路
由规则,如果发现规则为include包含,则再进入被包含的urls中的urlpatterns列表由上至下进行
查询

反斜线问题

Django中定义路由时,通常以斜线/结尾,其好处是用户访问不以斜线/结尾的相同路径时,
Django会把用户重定向到以斜线/结尾的路径上,而不会返回404不存在

views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):return HttpResponse('路由测试')def special_case_2022(request):return HttpResponse('路由测试1')def year_archive(request, year):return HttpResponse(f"year_archive{year}")def month_archive(request, year, month):return HttpResponse(f"month_archive 年:{year} 月:{month}")def article_detail(request, year, month, slug):return HttpResponse(f"article_detail 年:{year} 月:{month} {slug}")def str_cs(request,city):print('city的类型:',type(city))return HttpResponse(f'str_cs{city}')'''正则表达式'''
def re_special_case_2022(request):return HttpResponse('路由测试1')def re_year_archive(request, year):return HttpResponse(f"year_archive{year}")def re_month_archive(request, year, month):return HttpResponse(f"month_archive 年:{year} 月:{month}")def re_article_detail(request, year, month, slug):return HttpResponse(f"article_detail 年:{year} 月:{month} {slug}")'''传递额外参数'''
def blog_year_archive(request, year, major):return HttpResponse(f"blog_year_archive 年 {year} 额外参数:{major}")def re_blog_year_archive(request, year, major):return HttpResponse(f"blog_year_archive 年 {year} 额外参数:{major}")
urls.py
from django.contrib import admin
from django.urls import path , re_path
from urlAPPS.views import index
from urlAPPS import viewsurlpatterns = [# 路由转换器path('index/', index),# path('articles/2022/', views.special_case_2022),# path('articles/<int:year>/', views.year_archive),# path('articles/<int:year>/<int:month>/', views.month_archive),# path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),# str字符串类型测试# path('articles/<str:year>/', views.str_cs),# 正则表达式# re_path('articles/2021/$', views.re_special_case_2022),# re_path('articles/(?P<year>[0-9]{4})/$', views.re_year_archive),# re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.re_month_archive),# re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[-_\w]+) / $', views.re_article_detail),# 传递额外参数path('blog/<int:year>/', views.blog_year_archive, {'major': 'python'}),re_path('blog/(?P<year>[0-9]{4})/$', views.re_blog_year_archive, {'major':'python'}),
]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/2433.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB的安装

MongoDB数据库 MongoDB数据的特点&#xff1a; 面相文档存储的分布式数据库 具有很强的扩展性 支持丰富的查询表达式&#xff0c;很接近于关系性数据库 使用类似于json的结构保存数据&#xff0c;可以轻易的查询到文档中内嵌的对象及数组 下载安装包 首先去官网下载安装…

Spring 定时任务@Scheduled 注解中的 Cron 表达式

引言&#xff1a; Spring 框架提供了强大的定时任务功能&#xff0c;通过 Scheduled 注解可以方便地定义和管理定时任务。其中&#xff0c;Cron 表达式作为定时任务触发的时间表达式&#xff0c;扮演着重要的角色。本篇博客将详细介绍和讲解 Cron 表达式的语法和常见用法&…

多元分类预测 | Matlab鹈鹕算法(POA)优化混合核极限学习机(HKELM)分类预测,多特征输入模型,POA-HKELM分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab鹈鹕算法(POA)优化混合核极限学习机(HKELM)分类预测,多特征输入模型,POA-HKELM分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab…

专业科普:什么是单片机?

一、什么是单片机 单片机诞生于20世纪70年代末&#xff0c;它是指一个集成在一块芯片上的完整计算机系统。单片机具有一个完整计算机所需要的大部分部件&#xff1a;CPU、内存、内部和外部总线系统&#xff0c;目前大部分还会具有外存。同时集成诸如通讯接口、定时器&#xff…

threejs纹理

个人博客地址: https://cxx001.gitee.io 前面我们介绍了各种可以用来覆盖对象的材质&#xff0c;也介绍了如何修改材质的颜色、关泽和不透明度&#xff0c;但是我们还没有详细介绍如何在材质中使用外部图片(也叫纹理). 将纹理应用于材质 1. 加载纹理并应用到网格 纹理最基础…

Java中的可变参数

文章目录 可变参数概要可变参数例题可变参数的细节 可变参数概要 看到有道题&#xff0c;让你求出n个数的和&#xff0c;那么这个时候就可以使用Java中的可变参数来做。 格式&#xff1a; 数据类型...参数名 例如&#xff1a; int...args 其实可变参数的本质就是一个数组&…

使用 Jetpack Compose 实现 ViewPager2

在此博客中&#xff0c;我们将介绍如何在Jetpack Compose中实现ViewPager2的功能。我们将使用Accompanist库中的Pager库&#xff0c;这是由Google开发的一个用于Jetpack Compose的库。 首先&#xff0c;需要将Pager库添加到你的项目中&#xff1a; implementation androidx.co…

Jmeter远程服务模式运行时引用csv文件的路径配置

目录 前言&#xff1a; 问题 解决方法 前言&#xff1a; 在JMeter远程服务模式下运行时&#xff0c;你可以通过配置CSV文件的路径来引用该文件。CSV文件经常用于存储测试数据&#xff0c;可以在测试中进行参数化。 问题 在使用jmeter过程中&#xff0c;本机的内存等配置不…

【Linux】程序员的基本素养学习

这是目录 写在前面一、内存管理1、分段2、分页 二、线程管理三、静态库1、编译1.1、预处理1.2、编译1.3、汇编1.4、链接2、编译器3、目标文件**.text****.data****.bss****__attribute__** 3.1、符号3.2、兼容C语言 -- extern C4、链接 -- ld 写在前面 本文记录自己的学习生涯…

微服务架构之网关详解

前言 由于互联网的高速发展&#xff0c;网络数据请求数激增&#xff0c;使得服务器承受的压力越来越大。在早期的系统架构中&#xff0c;为减轻单台服务器的压力&#xff0c;通常使用 Load Balancer 来将网络流量平摊到多个服务器中。如今后端服务的种类和数量在不断变多&…

Linux--获取文件相关的各种时间:stat

stat是state英文的简写 语法&#xff1a; stat 文件名 功能&#xff1a; 获取文件的access&#xff08;访问时间&#xff09;、modify&#xff08;修改时间&#xff09;、change&#xff08;更改时间&#xff09; 文件的access时间&#xff08;访问时间&#xff09;指的是最…

npm报错(npm ERR! Unexpected token ‘.‘)

使用 nvm 将 node 切换到高版本后&#xff0c;运行 npm 相关的命令报的这个错 解决办法&#xff1a; 1、通过nvm list 命令查看当前都安装的node版本列表&#xff0c;依次通过 nvm uninstall [version] 命令将已经安装的 node 版本依次删除。 [version] 代表 node 版本号。 2…