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 index

urlpatterns = [
    path('index/', index),
]

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

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    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 views

urlpatterns = [
    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 views

urlpatterns = [
    # 路由转换器
    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 views

urlpatterns = [
    # 路由转换器
    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.mfbz.cn/a/34292.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Scrapy框架之MongoDB通过配置文件管理参数--Linux安装MongoDB--图形管理工具

目录 MongoDB通过配置文件 问题 解决方案 步骤 提示 Linux安装MongoDB 环境 下载依赖与安装包 解压安装 MongoDB GUI管理工具 独立软件GUI软件 Robo 3T使用 VSCode集成GUI插件 MongoDB通过配置文件 问题 启动MongoDB时&#xff0c;编写参数太麻烦 解决方案 通过配…

MATLAB App Designer基础教程 Matlab GUI入门(四)

坐标轴控件 axis 函数绘图方法技巧 作用&#xff1a; 绘制函数图像显示图像&#xff08;jpg png tiff&#xff09; 学习内容 App designer中 plot 和命令行中的 plot函数的不同&#xff1b;如何在坐标轴空间中显示两个函数图像&#xff1b;智能缩进 &#xff08;Ctrl I&am…

Linux——进程通信之共享内存

目录 一. 回顾上文 二.共享内存 1.定义 2.特点&#xff1a; 3.实现步骤&#xff1a; 如下为成功链接共享内存使用权的完整步骤&#xff1a; 4.函数介绍 4.1shmget函数 4.1.2参数介绍 4.2ftok函数&#xff1a; 4.2.1参数介绍 关于ftok(); shmget();函数的代码实验…

学习Kotlin~类

类 类的field 类定义的每一个属性&#xff0c;kotlin都会产生一个filed,一个setter(),一个getter()field用来存储属性数据&#xff0c;不能直接定义&#xff0c;kotlin会封装&#xff0c;保护它里面数据&#xff0c;只暴露给getter和setter使用只有可变属性才有setter方法需要…

探索 Jetson Nano 为 myCobot 280 机械臂提供的强大功能

探索 Jetson Nano 为 myCobot 280 提供的强大功能&#xff0c;机器人技术的一个有前途的组合 介绍 近年来&#xff0c;科学技术的发展给我们的生活带来了许多新的产品和服务&#xff0c;包括机器人在各个领域的集成。机器人已经成为我们生活中必不可少的一部分&#xff0c;从…

Vim 自定义配色

本文首发于我的个人博客&#xff0c;欢迎点击访问&#xff0c;无广告节面简洁&#xff01; 最近重新开始学习Vim装上了WSL2&#xff0c;但发现Windows Terminal和vim的组合还是有很多问题需要解决的&#xff0c;由其默认的配色在某些状态下根本看不清字体&#xff0c;所以折腾…

Nginx | 苹果电脑Mac安装和验证Nginx服务过程记录

common wx&#xff1a;CodingTechWork&#xff0c;一起学习进步。 引言 本文主要总结如何在Mac电脑上进行Nginx服务的安装&#xff0c;重点讲解使用brew命令进行安装和验证的过程及问题记录。 安装步骤 安装过程记录 查看nginx信息 首先使用命令brew info nginx进行本机ng…

《Pytorch深度学习和图神经网络(卷 1)》学习笔记——第七章

这一章内容有点丰富&#xff0c;多用了一些时间&#xff0c;实例就有四五个。 这章内容是真多啊&#xff01;&#xff08;学完之后又回到开头感叹&#xff09; 大脑分级处理机制&#xff1a; 将图像从基础像素到局部信息再到整体信息 即将图片由低级特征到高级特征进行逐级计…

基于群组实现从 Azure AD 到极狐GitLab 的单点登录

目录 配置单点登录 在 Azure AD 中创建企业应用 SAML 基础配置 配置 Azure “Attributes & Claims” 配置用户同步 在极狐GitLab 创建 SCIM Token 配置 Azure Provisioning Azure 手动用户预配 测试单点登录 Azure 自动用户同步 配置群组同步 配置 SAML 群组链…

打jar包

pom文件指定打包的类型是jar&#xff0c;并指定启动主类 <packaging>jar</packaging><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>…

什么条件下会出现死锁,如何避免?

文章目录 一、什么是死锁二、产生死锁的原因&#xff1a;三、如何避免死锁&#xff1a; 一、什么是死锁 死锁&#xff0c;简单来说就是两个或者两个以上的线程在执行过程中&#xff0c;去争夺同一个共享资源导致相互等待的现象。如果没有外部干预&#xff0c;线程会一直处于阻塞…

uniapp封装门票等票务样式

先看效果图 ticketpage组件引用后&#xff0c;根据父级背景颜色改变镂空的颜色,空组件只有中间镂空的样式&#xff0c;上面是插槽heaer,下面内容是插槽content&#xff0c;可以自定义自己的内容和样式。我实现的最终效果是用的uview组件&#xff0c;如果复现需要项目引入。可…

Nginx负载均衡与动静分离

一、Nginx负载均衡&#xff1a; 1.概述&#xff1a; Nginx是一款http服务器软件&#xff0c;支持高达50000个并发连接数的响应。 &#xff08;1&#xff09;拥有强大的处理静态资源的能力。 &#xff08;2&#xff09;运行稳定。 &#xff08;3&#xff09;CPU&#xff0c…

【Unity3D编辑器开发】Unity3D中初次尝试使用PropertyDrawer属性

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 前段时间一直比较忙&#xff0c;没有时间更新博客&#xff0c;…

2011年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题——纯享题目版

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&…

tomcat接入skywalking

tomcat接入skywalking 一、说明二、步骤2.1 准备java-agent包2.2 tomcat部署2.2.1 下载2.2.2 tomcat修改catalina.sh文件2.2.3 tomcat修改启动端口2.2.4 启动tomcat 三、验证四、问题排查4.1 tomcat的启动日志 一、说明 服务器中已经运行着skywalking&#xff0c;准备在同一台…

7-WebApis-5

Web APIs - 5 目标&#xff1a; 能够利用JS操作浏览器,具备利用本地存储实现学生就业表的能力 BOM操作综合案例 js组成 JavaScript的组成 ECMAScript: 规定了js基础语法核心知识。比如&#xff1a;变量、分支语句、循环语句、对象等等 Web APIs : DOM 文档对象模型&#xff…

2023全云在线联合微软AIGC专场沙龙:人工智能与企业创新,促进创造力的数字化转型

6月29日&#xff0c;由全云在线平台和微软联合主办的人工智能与企业创新&#xff1a;促进创造力的数字化转型——2023AIGC微软专场沙龙在广州天河区正佳万豪酒店举行。 关于2023AIGC微软专场沙龙 GPT翻开了AGI新的一页&#xff0c;也翻开了各行各业的新篇章。 2022年11月30日…

使用Jmeter读取和使用Redis数据

目录 前言 缓存 Redis服务和客户端安装 Jmeter使用Redis 前言 在使用 JMeter 进行性能测试时&#xff0c;有时需要读取和使用 Redis 数据。Redis 是一个开源的内存数据存储系统&#xff0c;常用于缓存、消息队列和数据存储等场景。 缓存 Web系统通常使用数据库来存储数据…

性能测试讲解超详细Jmeter

目录 什么是性能 性能测试的目的 功能测试和性能测试 基准测试 负载测试 稳定性测试 压力测试 并发测试 总结 性能测试指标 响应时间 并发数 吞吐量 点击数 错误率 资源使用率 总结 性能测试流程 性能测试需求分析 性能测试计划和方案 ​编辑性能测试用例​编辑 性…