Django(四、路由层)

news2024/11/20 2:37:01

文章目录

  • 一、路由层
      • 1.路由匹配
      • url方法第一个是参数 的正则表达式
  • 二、正则无名分组与有名分组
      • 无名分组
      • 有名分组
  • 三、反向解析
      • 1.概念
      • 无名分组动态路由解析
      • 有名分组动态路由解析
  • 四、路由分发
            • 为什么要用路由分发?
      • 1.总路由分发配置
      • 名称空间
  • 五、伪静态的概念
  • 六、虚拟环境
      • 什么是虚拟环境?
      • 如何创建虚拟环境?
  • django1和django2的区别
      • 1. 路由文件
            • Django默认支持以下5个转化器:

一、路由层

1.路由匹配

Django 1.x中第一个参数是正则表达式
Django 2.x 及以上版本 path第一个参数写的是什么就匹配什么,匹配到直接执行对应的视图函数,精准匹配不支持正则表达式

在这里插入图片描述
settings配置文件内添加(控制django是否自动添加斜杠匹配)

APPEND_SLASH = False/True   # 默认是True自动添加斜杠

如果不想每次点击http://127.0.0.1:8000/跳转出报错的话可以在路由里指定

url(r'^$', views.test),

为空的时候加载页面为test

url方法第一个是参数 的正则表达式

urlpatterns = [
    path('^admin/', admin.site.urls),
    # 首页 默认进去
    path('^$',views.home),
    # 路由匹配
    path('^test/$',views.test),
    path('^testadd/$',views.testadd),
    # 尾页(了解 后期异常捕获)
    path('',views.error),
]

解析:
    ^	: 开头
    $	: 结尾 

二、正则无名分组与有名分组

无名分组

无名分组就是给某一段正则表达式用括号括起来

url(r'^test/(\d+)/$', views.test)
无名分组:会将括号内正则表达式匹配到的内容当做位置参数传递给视图函数

get请求的第一种方式:
http://127.0.0.1:8000/test/?a=1&b=2

get请求的第二种方式:
http://127.0.0.1:8000/test/123/11

代码实现

urls.py
# 会把括号中匹配的数字当成位置参数传给视图函数
url(r'^test/(\d+)/$',views.test)


views.py
def test(request,xx):
    print(xx)
    return HttpResponse('test')
  
正则:    
\d+	: 匹配任意数字

有名分组

url(r'^test/(?P<year>\d+)/(?P<month>\d+)$', views.test),
有名分组就是把正则中小括号里的匹配到的内容以关键字参数的形式传递给视图函数

有名无名不可以混合使用,但是可以分别多次使用
1.无名分组单个使用多次
path('^index/(\d(4))/(\d(4))/(\d(4))/',views.index),

2.有名分组单个使用多次
path('^index/(?P<year>\d+)/(?P<age>\d+)/(?P<month>\d+)/',views.index),

def index(request,*args,**kwargs):
    print(args)
    return HttpResponse('index')

三、反向解析

路由频繁变化的时候,html页面与后端上的链接地址如何做到动态解析呢?

通过在url里面设置路由和视图函数的别名,动态解析出对应的路由,该路由直接执行对应的函数,函数直接执行对应的url

1.概念

通过一些方法得到一个结果,该结果可以直接访问对应的url触发视图函数,实现url路由频繁变化,HTML界面与后端动态解析链接地址操作步骤:

1.反向解析器路由配置
url(r'^1/2/3/4/testadd/$', views.testadd, name='testadd'),  # name='testadd' 起别名
前后端反向解析
2.在视图文件中导入模块reverse
from django.shortcuts import render,HttpResponse,redirect,reverse
3.反向解析  reverse('testadd')
def test(request):
    print(reverse('testadd'))
    return render(request,'index.html')
前端反向解析
4.前端模板文件反向解析
<a href="{% url 'testadd' %}">点击跳转</a>

无名分组动态路由解析

1.反向解析路由配置
url(r'^1/2/3/4/testadd/(\d+)/(\d+)/$', views.testadd, name='testadd'),

2.在视图文件中导入reverse模块
from django.shortcuts import render,HttpResponse,redirect,reverse

3.反向解析 reverse('testadd' args='(1,123)')
def test(request,*args,**kwargs):
	res = reverse('testadd')
	print(res)
	print(args,kwargs)
	return render(request,'index.html')
	
前端反向解析
4.前端模板文件反向解析
<a href="{% url 'testadd' 1 123 %}">点击跳转</a>  根据路由来需要添加2个参数

有名分组动态路由解析

1.反向解析路由配置
url(r'^1/2/3/4/testadd/(?P<year>\d+)/(?P<month>\d+)/$', views.testadd, name='testadd'),

2.在视图文件中导入reverse模块
from django.shortcuts import render,HttpResponse,redirect,reverse

3.反向解析
reverse('testadd' args='(1,123)')
reverse('testadd' kwargs={'year':1,'month':123})

def test(request,*args,**kwargs):
	res = reverse('testadd')
	print(res)
	print(args,kwargs)
	return render(request,'index.html')
	
前端反向解析
4.前端模板文件反向解析
<a href="{% url 'testadd' year=1 month=123 %}">点击跳转</a>  根据路由来需要添加2个关键字参数

四、路由分发

django支持每个应用都可以由自己独立的路由层(url.py)、静态文件(static文件夹)、模板层(templates)。基于该特性多人开发项目就可以完全解耦合,之后利用路由分发还可以整合到一起

为什么要用路由分发?
  • 解决项目的总路由匹配关系过多的情况
  • 总路由分开于干路由与视图函数的的直接对应关系
  • 总路由是一个分发处理(识别当前url是属于哪个应用下的,直接分发对应的应用去处理)
  • 当请求来了,总路由不做对应关系,根据请求直接访问哪个app的功能,直接将请求发送给对应的app
  • 提前创建好应用app01(创建即注册)、app02,然后记得注册app02

1.总路由分发配置

使用路由分发之前,总路由直接干路由与属于函数的匹配

方式一:

1.需要导入一个include路由分发模块
from django.conf.urls import url,include
2.导入子路由的urls  为了重名,起别名
from app01 import urls as app01——urls
from app02 import urls as app02——urls
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 1.路由分发
    url(r'^app01/',include(app01_urls)),  # 只要url前缀是app01开头 全部交给app01处理
    url(r'^app02/',include(app02_urls))   # 只要url前缀是app02开头 全部交给app02处理
]

方式二:

1.需要导入一个include路由分发模块
from django.urls import path,include
2.总路由分发  简易>>>推荐
urlpatterns = [
# 路由分发终极写法 简便
    path('app01/',include('app01.urls')),
    path('app02/',include('app02.urls'))

名称空间

路由分发之后,针对相同的别名是否能自动反向解析不同的应用前缀,默认情况下是无法直接识别应用前缀的,如果想要正常识别应用前缀,有以下两种方式:

总路由
path('app01/',include(('app01.urls','app01'),namespace='app01')),  # 创建了名称空间app01
path('app02/',include(('app02.urls','app02'),namespace='app02')),  # 创建了名称空间app02

反向解析
后端
def index(request):
	print(reverse('app01:index_view'))
    return HttpResponse ('index from app01')

def index(request):
    print(reverse('app02:index_view'))
    return HttpResponse reverse('app02:index_view')

前端页面
{% url 'app01:index_view'%}

子路由:
urlpatterns = [
   url('^index/',views.index,name='index_view')
]
urlpatterns = [
    url('^index/',views.index,name='index_view')
]

方式2:别名不冲突即可 利用应用名作为别名的前缀

1.总路由
urlpatterns = [
    url('admin/', admin.site.urls),
    # 路由分发
    url('app01/',include('app01.urls')),
    url('app02/',include('app02.urls'))
]

2.子路由
urlpatterns = [
  url('index/',views.index,name='app01_index_view')
  url('index/',views.index,name='app02_index_view')
]
3.后端
 reverse('app01_index_view')
 reverse('app02_index_view')

总结:只要保证名字不冲突骂我们就没必要使用名称空间,直接在路由起别名的时候加载app名作为别名的前缀

五、伪静态的概念

伪静态: 其实就是把动态页面改成静态页面
动态页面:
	"""它不是在html页面中写死的,它是根据后端的数据变化而变化"""
    我们的页面上的数据是从数据库查询出来都是可以是动态页面
    
静态页面:
	html
     css
案例:
	https://www.cnblogs.com/bigsai/p/17827160.html # 这个就是伪装之后的页面
伪装的目的:
	"""为了更好的被各大搜索引擎抓大,静态页面是最容易被抓到的,有个别的网站就会做伪装,seo"""
    seo:优化关键词被容易搜索到
    sem: 广告(RMB)
怎么样去伪装	 
	url(r'^v1/v2/test.html/$', views.test)

六、虚拟环境

什么是虚拟环境?

项目1需要使用:django1.11 								 python38
项目2需要使用:django2.22 pymysql requests			      python38
项目3需要使用:django3.22 request_html flask urllib3		 python38
    
  虚拟环境:能够针对相同版本的解释器创建多个分身 每个分身可以有自己独立的环境
  pycharm创建虚拟环境:(每创建一个虚拟环境就相当于重新下载了一个全新的解释器)

实际开发过程,我们需要给不同的项目配备不同的环境,项目需要用到的环境是什么我们就给装什么样的环境。一般不用的我们不装,因为虚拟环境创建太多(第三方模块或者工具太),是会消耗硬盘空间。

​ 目前我们不使用虚拟环境,所有的模块统一下载到本地

如何创建虚拟环境?

1.pycharm创建虚拟环境

1、创建虚拟环境
2、虚拟环境标志
3、虚拟环境下载django
4、使用虚拟环境

如果下载过程出现问题了,就复制提示的解决方法到文件上方框里去执行
pip install --index-url http://mirrors.aliyun.com/pypi/simple/ django==1.11.11 --trusted-host mirrors.aliyun.com

在这里插入图片描述

django1和django2的区别

1. 路由文件

django1.x中使用的是url:支持正则
django2.x中使用的是path(不支持正则:精准匹配)和re_path(url):支持正则
path:但是它只支持五种转换器

Django默认支持以下5个转化器:

● str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
● int,匹配正整数,包含0。
● slug,匹配字母、数字以及横杠、下划线组成的字符串。
● uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
● path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【STM32 CAN】STM32G47x 单片机FDCAN作为普通CAN外设使用教程

STM32G47x 单片机FDCAN作为普通CAN外设使用教程 控制器局域网总线&#xff08;CAN&#xff0c;Controller Area Network&#xff09;是一种用于实时应用的串行通讯协议总线&#xff0c;它可以使用双绞线来传输信号&#xff0c;是世界上应用最广泛的现场总线之一。CAN协议用于汽…

基于SSM+Vue的网上购物商城

基于SSMVue的网上购物商城的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringMyBatisSpringMVC工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 商品详情 登录界面 管理员界面 用户界面 可视化图标 摘要 基于SSM&#xff0…

vcomp120.dll丢失怎么办?vcomp120.dll丢失的解决方法分享

vcomp120.dll丢失”。这个错误通常会导致某些应用程序无法正常运行&#xff0c;给用户带来困扰。那么&#xff0c;当我们遇到这个问题时&#xff0c;应该如何修复呢&#xff1f;下面我将为大家介绍四个修复vcomp120.dll丢失的方法。 一、使用dll修复程序修复 可以通过百度或许…

Knife4j在springboot3中如何集成呢(如果大家阅读能力好的话,建议直接看作者写的博客。当然,在下面也会附上作者的博客)

一.为什么会写这篇博客呢&#xff1f; 因为本作者在使用springboot2的时候还好好的&#xff0c;将springbooot2升到springboot3的时候&#xff0c;发现我天&#xff0c;knife4j好像出问题了&#xff0c;找了好久才发现时knife4j的版本问题。 二.说一下knife4j的版本问题吧&…

力扣刷题-二叉树-二叉树的层序遍历(相关题目总结)

思路 层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。 需要借用一个辅助数据结构即队列来实现&#xff0c;队列先进先出&#xff0c;符合一层一层遍历的逻辑&#xff0c;而用栈先进后出适合模拟深度优先遍历也就是递归的…

力扣刷题-二叉树-翻转二叉树

226.翻转二叉树 翻转一棵二叉树。 思路 参考&#xff1a; https://www.programmercarl.com/0226.%E7%BF%BB%E8%BD%AC%E4%BA%8C%E5%8F%89%E6%A0%91.html#%E6%80%9D%E8%B7%AF 如果要从整个树来看&#xff0c;翻转还真的挺复杂&#xff0c;整个树以中间分割线进行翻转&#xf…

【CUDA编程--编程模型简介算子开发流程】

官方文档&#xff1a;https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html 什么是CUDA CUDA全称&#xff08;Compute Unified Device Architecture&#xff09;统一计算架构&#xff0c;是NVIDIA推出的并行计算平台深度学习加速&#xff1a;对于神经网络&…

超级干货:光纤知识总结最全的文章

你们好&#xff0c;我的网工朋友。 光纤已经是远距离有线信号传输的主要手段&#xff0c;而安装、维护光纤也是很多人网络布线的基本功。 在网络布线中&#xff0c;通常室外楼宇间幢与幢之间使用的是光缆&#xff0c;室内楼宇内部大都使用的是以太网双绞线&#xff0c;也有使用…

前端案例-css实现ul中对li进行换行

场景描述&#xff1a; 我想要实现&#xff0c;在展示的item个数少于4个的时候&#xff0c;则排成一行&#xff0c;并且均分&#xff08;比如说有3个&#xff0c;则每个的宽度为33.3%&#xff09;&#xff0c;如果item 个数大于4&#xff0c;则进行换行。 效果如下&#xff1a…

冰点还原精灵_Deep Freeze Standard v8.60.020.5592中文版

eep Freeze&#xff08;又被成为冰点还原精灵&#xff09;是Faronics公司出品的一款简单易用的系统还原软件&#xff0c;使用能够帮助用户轻松将系统还原到安装该款软件之后状态&#xff0c;避免因为病毒的入侵以及人为的对系统无意或无意的破坏&#xff0c;让你的系统始终完美…

HTTP——

HTTP 请求报文的构成 如下图: 第一行:HTTP请求的方法,具体是POST方法还是GET方法,或是其它方法;URI就是你的HTTP请求的路径;后面是HTTP协议的版本; 第二行往下连续多行:这些是请求头部分,也就是请求的首部设置的一些信息,相当于对HTTP请求的一些设置; 空格行:在…

【PIE-Engine 数据资源】全球250米LAI产品

文章目录 一、 简介二、描述三、波段四、示例代码参考资料 一、 简介 数据名称全球250米LAI产品时间范围2015年空间范围全球数据来源北京师范大学肖志强教授团队代码片段var images pie.ImageCollection(“BNU/LAI/GLOBAL-250”) 二、描述 全球 250 米叶面指数产品由北京师范…

VS Code设置技巧

基础设置 中文界面 安装扩展&#xff1a;Chinese(Simplified) Language Pack 自动换行 文件 - 首选项 - 设置&#xff0c;搜索wrap&#xff0c;找到Editor: Word Wrap&#xff0c;将其更改为on。

分享一个个人博客神器 VanBlog

一、先看效果图 这是前台页面&#xff0c;我已经发布了一篇文章 这是后台页面 一句话&#xff0c;真的好用&#xff0c;各种功能一应俱全&#xff0c;废话不多说&#xff0c;开始吧。 二、 安装docker容器技术 如果你没有安装 docker 和 docker-compose&#xff0c;可以通…

错误边界(Error boundary)

错误边界&#xff08;Error boundary&#xff09;: 用来捕获后代组件错误&#xff0c;渲染出备用页面 只能捕获后代组件生命周期产生的错误&#xff0c;不能捕获自己组件产生的错误和其他组件在合成事件、定时器中产生的错误 getDerivedStateFromError配合componentDidCatch 案…

C++--二叉树经典例题

本文&#xff0c;我们主要讲解一些适合用C的数据结构来求解的二叉树问题&#xff0c;其中涉及了二叉树的遍历&#xff0c;栈和队列等数据结构&#xff0c;递归与回溯等知识&#xff0c;希望可以帮助你进一步理解二叉树。 目录​​​​​​​ 1.二叉树的层序遍历 2.二叉树的公…

【Redis】Zset有序集合

上一篇&#xff1a; Hash哈希类型 https://blog.csdn.net/m0_67930426/article/details/134382507?spm1001.2014.3001.5502 目录 Zadd Zrange Zcard Zcount Zrem set是一个无序且元素不可重复的集合 而Zset是一个有序的集合,集合里的每个元素都有一个评分&#xff08;…

Linux网络——自定义协议

目录 一.什么是协议 二.协议与报文 三.自定义协议 1.封装套接字 2.构建请求与响应 3.序列化和反序列化 4.报头添加和去除 5.报文读取 四.服务器端程序 五.客户端程序 一.什么是协议 协议在生活中泛指&#xff1a;双方或多方为了完成某项任务或达成某种目的而制定的共…

文件操作(上)

目录 为什么使用文件什么是文件&#xff1f;程序文件数据文件文件名 二进制文件和文本文件文件的打开和关闭流和标准流流标准流 文件指针文件的打开和关闭 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &…