Django(四、路由层)

文章目录

  • 一、路由层
      • 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,reverse3.反向解析 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,reverse3.反向解析
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页面中写死的,它是根据后端的数据变化而变化"""我们的页面上的数据是从数据库查询出来都是可以是动态页面静态页面:htmlcss
案例: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.mzph.cn/news/140962.shtml

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

相关文章

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

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

企业微信开发教程一:添加企微应用流程图解以及常见问题图文说明

最近在前辈的基础上新添加了一个企微应用&#xff0c;过程中遇到了一些卡点&#xff0c;这里一一通过图片标注与注释的方式记录一下&#xff0c;希望能给后来人提供一些清晰明了的帮助&#xff0c;话不多说&#xff0c;大家直接看图吧。 &#xff08;文中包括一些本项目独有的配…

linux下使用Docker Compose部署Spug实现公网远程访问

&#x1f4d1;前言 本文主要是linux下使用Docker Compose部署Spug实现公网远程访问的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &am…

游戏平台采集数据

首先&#xff0c;你需要在你的项目中添加Kotlin的网络库&#xff0c;例如OkHttp。你可以在你的build.gradle文件中添加以下依赖&#xff1a; dependencies {implementation com.squareup.okhttp3:okhttp:4.9.0 }然后&#xff0c;你可以使用以下代码来创建一个基本的网络爬虫&a…

5年测试经验之谈:2年功能测试、3年自动化测试,从入门到25k...

毕业3年了&#xff0c;学的是环境工程专业&#xff0c;毕业后零基础转行做软件测试。 已近从事测试行业8年了&#xff0c;自己也从事过2年的手工测试&#xff0c;从事期间越来越觉得如果一直在手工测试的道路上前进&#xff0c;并不会有很大的发展&#xff0c;所以通过自己的努…

ZYNQ_project:IP_ram_pll_test

例化MMCM ip核&#xff0c;产生100Mhz&#xff0c;100Mhz并相位偏移180&#xff0c;50Mhz&#xff0c;25Mhz的时钟信号。 例化单口ram&#xff0c;并编写读写控制器&#xff0c;实现32个数据的写入与读出。 模块框图&#xff1a; 代码&#xff1a; module ip_top(input …

Flutter笔记:关于Flutter中的大文件上传(上)

Flutter笔记 关于Flutter中的大文件上传&#xff08;上&#xff09; 大文件上传背景与 Flutter 端实现文件分片传输 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#…

matlab模糊控制文件m代码实现和基础理论

1、内容简介 略 15-可以交流、咨询、答疑 通过m代码来实现生成模糊文件fis文件 2、内容说明 模糊文件m代码实现和基础理论 matlab模糊控制文件m代码实现和基础理论 模糊文件、m代码和模糊基础理论 3、仿真分析 略 4、参考论文 略 链接&#xff1a;https://pan.baidu.co…

Sui学术研究奖公布,资助研究者探索人工智能、能源市场和区块链游戏

Sui基金会高兴地宣布首轮Sui学术研究奖&#xff08;SARAs&#xff09;的获奖者。SARAs计划提供资助&#xff0c;支持推动Sui区块链技术的研究。学术和研究界对我们的初次征集呈现出大量高质量的提案。 已接受的九个提案涵盖了各种主题&#xff0c;如token经济学、智能合约机制…

docker stop slow 解决

验证 NanoMQ stop slow 的问题 daemon 和非 daemon 两种方式 docker stop 都很慢 疑问是默认情况下&#xff0c;SIGTERM 会被处理。 模拟 docker 内发送 SIGTERM 信号 # The default signal for kill is TERM # pkill will send the specified signal (by defau…

开发知识点-Django

Django 1 了解简介2 Django项目结构3 url 地址 和视图函数4 路由配置5 请求及响应6 GET请求和POST请求查询字符串 7 Django设计模式及模板层8 模板层-变量和标签9 模板层-过滤器和继承继承 重写 10 url反向解析11 静态文件12 Django 应用及分布式路由创建之后 注册 一下 13 模型…

matlab直线一级倒立摆lqr控制

1、内容简介 略 16-可以交流、咨询、答疑 matlab直线一级倒立摆lqr控制 2、内容说明 倒立摆是一个开环不稳定的强非线性系统&#xff0c;其控制策略与杂技运动员顶杆平衡表演的技巧有异曲同工之处&#xff0c;目的在于使得摆杆处于临界稳定状态&#xff0c;是进行控制理论研…

MySQL的SQL预编译及防SQL注入

文章目录 1 SQL语句的执行处理1.1 即时SQL1.2 预处理SQL1.2.1 预编译SQL的实现步骤1.2.2 预编译SQL的C使用举例1.2.3 MYSQL_BIND()函数中的参数类型&#xff1a; 2 SQL注入2.1 什么是SQL注入2.2 如何防止SQL注入 1 SQL语句的执行处理 SQL的执行可大致分为下面两种模式&#xf…

python双端队列_中间是头两边是尾_两边是头中间是尾

双端队列的顺序表存储结构以及两种特殊的双端队列 双端队列 是一种允许我们同时从前端和后端添加和删除元素的特殊队列&#xff0c;它是队列和栈的结合体。 双端队列&#xff08;deque&#xff09;与队列&#xff08;queue&#xff09;就差了两个字&#xff0c;队列里元素只能…

使用Redis实现热搜功能

Redis热搜 原理数据类型redis操作简单实现 实操封装方法执行方法最后使用springboot的定时任务对热搜榜单进行维护 原理 使用redis实现热搜的原理就是维护一个zset集合&#xff0c;然后使用score作为当前搜索词的搜索量&#xff0c;score越高的搜索词就说明该搜索词热度越高。…

css实战——清除列表中最后一个元素的下边距

需求描述 常见于列表的排版&#xff0c;如文章列表、用户列表、商品列表等。 代码实现 <div class"listBox"><div class"itemBox">文章1</div><div class"itemBox">文章2</div><div class"itemBox"…

SSM框架Demo: 简朴博客系统

文章目录 1. 前端页面效果2. 项目创建3. 前期配置3.1. 创建数据库数据表3.2. 配置文件 4. 创建实体类5. 统一处理5.1. 统一返回格式处理5.2. 统一异常处理 6. 全局变量7. Session工具类8. 登录拦截器9. 密码加盐加密10. 线程池组件11. dao层11.1. UserMapper11.2. ArticleMappe…

nodejs express vue uniapp电影购票系统源码

开发技术&#xff1a; node.js&#xff0c;vscode&#xff0c;HBuilder X express vue elementui uniapp 功能介绍&#xff1a; 用户端&#xff1a; 登录注册 首页显示搜索电影&#xff0c;轮播图&#xff0c;电影分类&#xff0c;最近上架电影 点击电影进入电影详情&am…

数据结构线性表——栈

前言&#xff1a;哈喽小伙伴们&#xff0c;今天我们将一起进入数据结构线性表的第四篇章——栈的讲解&#xff0c;栈还是比较简单的哦&#xff0c;跟紧博主的思路&#xff0c;不要掉队哦。 目录 一.什么是栈 二.如何实现栈 三.栈的实现 栈的初始化 四.栈的操作 1.数据入栈…