Django框架之路由层

【一】路由匹配

python 复制代码
# 路由匹配
path('test', views.test),
path('testadd', views.testadd),

无法跳转到 testadd

  • url方法第一个参数是正则表达式
    • 只要第一个参数正则表达式能够匹配到内容,就会立刻停止匹配,执行视图函数
python 复制代码
# 路由匹配
path('test/', views.test),
path('testadd/', views.testadd),

在参数尾部加一个 /

  • 在输入 url 的时候会默认加一个 /
    • Django内部会帮助我们做一个重定向
      • 一次匹配不行
      • 那就加一个 / 再尝试一次
  • 在配置文件中,有一个参数可以帮助我们干这件事

    APPEND_SLASH = True

  • 这个参数默认为True,即自动帮我们加 /

python 复制代码
re_path('^test/$', views.test),

这才是完整版的路由匹配格式

python 复制代码
re_path('^$', views.test),

匹配首页的路由格式

python 复制代码
# django2中
path('admin/', admin.site.urls), # 精准匹配,不支持正则表达式
path('test/', views.test), # 精准匹配,不支持正则表达式
re_path(r'^test/$', views.test) # url(r'^test/$', views.test),

【二】无名分组

  • 无名分组就是把正则中小括号里的匹配到的内容以位置参数的形式传递给视图函数
python 复制代码
无名分组
url(r'^test/(\d+)$', views.test),
python 复制代码
get请求的第一种方式:
http://127.0.0.1:8000/test/?a=1&b=2
get请求的第二种方式:
http://127.0.0.1:8000/test/123/11

【三】有名分组

  • 可以给正则表达式起一个别名
python 复制代码
#有名分组
url(r'^test/(?P<year>\d+)/(?P<month>\d+)$', views.test),
  • 有名分组就是将括号内正则表达式匹配到的内容当做关键字参数传给后面的视图函数

【四】无名有名混用

无名分组和有名分组不能混用

但是同一个分组可以使用多次

python 复制代码
# 无名有名混合使用
url(r'^test/(?P<year>\d+)/(\d+)$', views.test),

【五】反向解析

  • 通过一些方法得到一个结果,该结果可以直接访问到对应的url,触发视图函数

  • 先给路由与视图函数起一个别名

python 复制代码
url(r'^v1/v2/v3/home$', views.home, name='home'),
  • 反向解析

    • 后端反向解析
python 复制代码
res=reverse('home') # /v1/v2/v3/home
print(res)
  • 前端反向解析
python 复制代码
<a href="{% url 'home' %}">xxxx</a>

【六】无名有名分组反向解析

本质上还是通过一些方法得到一个结果,该结果可以访问到对应的url从而触发相应的视图和功能

【1】无名分组反向路由解析

(1)引入
1.1 路由
python 复制代码
#无名分组反向解析
url(r'^v1/v2/v3/home/(\d+)/(\d+)/$', views.home, name='home')
1.2后端解析
python 复制代码
# 后端解析
res=reverse('home', args=(123, 11)) # /v1/v2/v3/home/1
print(res)
1.3前端解析
python 复制代码
# 前端解析
<a href="{% url 'home' 1 123 %}">点我看美女</a>
  • 这个数字存在的意义到底是什么?
    • 数字一般情况下放的是数据的主键值
    • 数据的标记和删除功能

【2】有名分组反向解析

2.1 路由
python 复制代码
#有名分组反向解析
url(r'^v1/v2/v3/home/(?P<year>\d+)/(?P<mon>\d+)/$', views.home, name='home')
2.2 后端解析
python 复制代码
# 后端解析
res=reverse('home', args=(123, 11)) # /v1/v2/v3/home/1
res=reverse('home', kwargs={'year':123, 'mon':1}) # /v1/v2/v3/home/1
print(res)
2.3 前端解析
python 复制代码
# 前端解析
<a href="{% url 'home' year=1 mon=123 %}">点我看美女</a>

【七】路由分发

  • Django每一个应用都可以拥有属于自己的

    • templates文件夹
    • urls.py
    • static文件夹
  • 正是基于上述的特点,Django可以很好的做到自己的分组开发(每个人只写自己的app)

  • 最后只需要将所有的app拷贝到新的文件,并将这些APP注册到配置文件中,然后再利用路由分发的特点,将所有的APP整合起来

  • 当一个项目中的URL特别多的时候,总路由urls.py的代码非常冗余而且不好维护,这个时候就可以利用路由分发来减轻总路由的压力

  • 利用路由分发之后,总路由不再干预路由与视图函数的直接对应关系

    • 而是做一个分发处理
    • 识别当前的url是属于哪个应用下的,直接分发给对应的应用去处理
python 复制代码
# 路由的分发
url(r'^app01/', include(app01_urls)),
url(r'^app02/', include(app02_urls)),
# 第二种方式
url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls')),

分发的路由第一个参数最后一个不要加 $

【八】名称空间

  • 当多个应用出现相同的别名,反向解析不会自动识别应用前缀
  • 正常情况下的反向解析是不能识别前缀的
python 复制代码
# 第二种方式
url(r'^app01/', include('app01.urls', namespace='app01')),
url(r'^app02/', include('app02.urls', namespace='app02')),

# 解析
res=reverse('app01:login', args=(11,22)) # /v1/v2/v3/home/1
res=reverse('app02:login', args=(11,22)) # /v1/v2/v3/home/1

只要保证名字不冲突,就没必要使用名称空间

一般情况下,有多个app的时候只要在前面加上app的前缀,这样就能够确保多个app之间名字不冲突

【九】伪静态

  • 静态网页
    • 数据是写死的
  • 伪静态
    • 将一个动态网页伪装成静态网页
  • 伪装的目的在于增大本网站的seo查询力度
    • 并且增加搜索引擎收藏本网页的概率
  • 搜索引擎本质上就是一个巨大的爬虫程序

动态页面:

它不是在html页面中写死的,它是根据后端的数据变化而变化

我们的页面上的数据是从数据库查询出来都是可以是动态页面

案例:

https://www.cnblogs.com/bigsai/p/17827160.html 这个就是伪装之后的页面

伪装的目的:

为了更好的被各大搜索引擎抓大,静态页面是最容易被抓到的,有个别的网站就会做伪装,seo

seo:优化关键词被容易搜索到

sem: 广告(RMB)

怎么样去伪装

python 复制代码
url(r'^v1/v2/test.html/$', views.test)

【十】虚拟环境

  • 在正常开发中,我们会给每一个项目独有的解释器环境
  • 该环境内只有该项目用到的模块,用不到的一概不装

虚拟环境:

​ 每创建一个虚拟环境就类似于重新下载了一个纯净的python解释器

​ 但是虚拟器不建议下载太多,创建虚拟环境是需要消耗磁盘空间的

模块管理文件:

​ 每个项目都需要用到很多模块,并且每个模块的版本可能是不一样的

​ 这种情况下我们会给每一个项目配备一个requirements.txt文件,里面存放着我们这个项目所安装的所有模块及版本

​ 只需要一条命令即可安装所有模块及版本

【十一】Django1和Django2的区别

【1】路由匹配规则

  • Django1.x路由层使用的是url方法
  • 在Django2.x版本以后在路由层使用的是path方法
    • url() 第一个参数支持正则
    • path() 第一个参数不支持正则,写什么就匹配到什么

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

● str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式

● int,匹配正整数,包含0。

● slug,匹配字母、数字以及横杠、下划线组成的字符串。

● uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。

● path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

【2】自定义转换器

  • Django支持自定义转换器
  • 创建表关系
    • django2中必须指定参数:on_delete:
    • djanxo1中不用指定:级联更新级联删除
相关推荐
小白小白从不日白3 分钟前
react hooks--useReducer
前端·javascript·react.js
沐风ya3 分钟前
Reactor介绍,如何从简易版本的epoll修改成Reactor模型(demo版本代码+详细介绍)
网络
SUGERBOOM6 分钟前
【网络安全】网络基础第一阶段——第一节:网络协议基础---- OSI与TCP/IP协议
网络·网络协议·web安全
下雪天的夏风15 分钟前
TS - tsconfig.json 和 tsconfig.node.json 的关系,如何在TS 中使用 JS 不报错
前端·javascript·typescript
petaexpress23 分钟前
常用的k8s容器网络模式有哪些?
网络·容器·kubernetes
diygwcom27 分钟前
electron-updater实现electron全量版本更新
前端·javascript·electron
Hello-Mr.Wang43 分钟前
vue3中开发引导页的方法
开发语言·前端·javascript
程序员凡尘1 小时前
完美解决 Array 方法 (map/filter/reduce) 不按预期工作 的正确解决方法,亲测有效!!!
前端·javascript·vue.js
m0_609000423 小时前
向日葵好用吗?4款稳定的远程控制软件推荐。
运维·服务器·网络·人工智能·远程工作
编程零零七5 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql