路由层

目录

  • django请求生命周期流程图
  • *路由层相关知识

内容

django请求生命周期流程图

整体概括请求的走向以及django的核心组成部分

路由匹配

路由匹配的特点

只要匹配上了就会立刻结束执行对应的视图函数,并且url方法的第一个参数其实是一个正则表达式,只要正则表达式能够从用户输入的后缀中匹配到内容就算匹配上了

正则是test 内容是test 那么可以匹配出test文本

正则是test 内容是testadd 那么还可以匹配出test文本

django二次追加斜杠机制

正则是test/,内容是test,那么首次无法匹配,首次匹配不上 那么django还会让浏览器默认加斜杠再次发送请求

首次是test 301,第二次就是test/ 200

斜杠机制可以取消,但是不推荐

APPEND_SLASH = False

解决路由前面可以随意乱写的问题

正则是test/,内容是abcdefgtest/,那么可以匹配出文本test

可以在正则的最前面加上 上箭头来限制

解决路由后面可以随意乱写的问题

正则是^test/,内容是test/abc/edf/acd/,那么可以匹配出文本test

可以在正则的最后面加上 $来限制

由于第一个参数是正则,所以当项目特别大,对应关系特别多的时候要格外的注意是否会出现路由顶替的现象

定制一个主页面

用户不携带后缀可以直接访问

url(r’^$’,views.home)

定义一个尾页

用户输入一个没有对应关系的直接返回

url(r’.*’,views.error)
无名有名分组

无名分组

url(r’^test/([0-9]{4})/$’, views.test)

路由匹配成功之后就会调用视图函数默认情况下会自动给视图函数传递一个request位置参数

test(request)

如果路由匹配中使用括号对正则表达式进行了分组,那么在调用视图函数的时候会将括号内匹配到的内容当做位置参数传递给视图函数

test(request,括号内正则表达式匹配到的内容)

有名分组

url(r’^testadd/(?P

给括号内的正则表达式起别名之后,匹配成功则会讲括号内匹配到的内容按照关键字参数传递给视图函数

testadd(request,user_id=括号内正则表达式匹配到的内容)

无名有名分组不能混合使用,单个可以重复使用

反向解析

补充

a标签的href可以写网址的全称,也可以写后缀href=’https://www.baidu.com‘href=’/login/’(自动补全当前服务的ip和port)

反向解析

页面上有很多a标签链接了其他路由,路由匹配表达式出现了变化,html页面上的地址全部失效

通过反向解析可以获取到一个结果 该结果可以访问到一个路由

步骤1:给对应关系起别名

url(r’^func666/’,views.func,name=’func_view’)

步骤2:使用反向解析获取结果

前端:{% url ‘func_view’ %}

后端:from django.shortcuts import reverse reverse(‘func_view’)

无名分组反向解析

步骤1:给对应关系起别名

url(r’^func666/(\d+)/’,views.func,name=’func_view’)

步骤2:使用反向解析获取结果

无法明确括号内正则表达式的内容 需要人为指定

前端:{% url ‘func_view’ 123 %}

后端:from django.shortcuts import reverse reverse(‘func_view’,args=(666,))

有名分组反向解析

步骤1:给对应关系起别名

url(r’^func666/(?P

步骤2:使用反向解析获取结果

无法明确括号内正则表达式的内容 需要人为指定

前端:{% url ‘func_view’ 123 %} ;{% url ‘func_view’ id=123 %}

后端:from django.shortcuts import reverse reverse(‘func_view’,args=(666,)) reverse(‘func_view’,kwargs={‘id’:1}) 无名有名反向解析中的手动传值,这个值在实际工作中可以是 数据的主键值、页面的页码、区域的编号
路由分发

如果一个django项目特别庞大,里面有很多应用,每个应用下有很多对应关系 ,那么django自带的路由层里面的代码就会非常非常的多,如何优化?

根据应用的不同拆分到不同的应用中,django支持每个应用都可以有自己独立的路由层、模板层、静态文件、视图层(默认)、模型层(默认)上述特性能够让django在分组开发上更加的方便快捷,所有人都可以在应用中开发完整的项目功能,最后汇总到一个空的django项目中,然后通过路由分发整合所有人的应用

1.创建多个应用,并去配置文件中注册

INSTALLED_APPS = [‘app01′,’app02’]

2.在多个应用中编写相同的路由

urlpatterns = [

url(r’^index/’,views.index111)]urlpatterns = [url(r’^index/’,views.index)]

3.路由分发

总路由

路由层路由层
from django.conf.urls import url, include

from app01 import urls as app01_urls

from app02 import urls as app02_urls

url(r'^app01/',include(app01_urls)),

url(r'^app02/',include(app02_urls))

View Code

总路由只负责分发 不负责视图函数对应

上述代码还可以简写

路由层路由层
from django.conf.urls import url, include

url(r'^app01/',include('app01.urls')),

url(r'^app02/',include('app02.urls'))

View Code

如果多个应用下业务逻辑代码很多,导致views.py内代码繁重

我们可以将views.py移除,换成views文件夹,然后在该文件夹内根据业务逻辑的不同拆分成不同的py文件

总路由结尾一定不能加 $符,否则无法分发
名称空间

默认情况下反向解析是不会自动识别应用前缀的,如何解决反向解析问题

方式1:名称空间

总路由添加名称空间url(r’^app01/’,include(‘app01.urls’,namespace=’app01′)),url(r’^app02/’,include(‘app02.urls’,namespace=’app02′))应用反向解析自动提示reverse(‘app01:index_view’)reverse(‘app02:index_view’){% url ‘app01:index_view’ %}{% url ‘app02:index_view’ %}

方式2:只需要确保反向解析的别名在整个项目中不重复即可

可以在别名的前面加上应用名的前缀url(r’^index/’,views.index,name=’app01_index_view’)url(r’^index/’,views.index,name=’app02_index_view’)

Original: https://www.cnblogs.com/zzs0626/p/16264223.html
Author: 顺溜_7
Title: 路由层

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582446/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • bash是什么?

    ​ –解释器,启动器 ​ –解释器: ​ 用户交互输入 如vim 文本文件输入 !/bin/bash *!/usr/bin/python bash/sh f…

    Linux 2023年5月27日
    083
  • 为spring cloud config实现刷新动态掉的坑

    正常搭建配置中心,网上教程多,这里不讨论,只记坑也是为了后来者少花时间在这里,由于是当时研究了好久才写的文章,所以只能提供问题的原因,当然会给出印证的思路,闲话不多说进入正题! 版…

    Linux 2023年6月7日
    099
  • Action Sheets 和 Activity Views

    行动表行动表是一种特殊的提醒方式,它展示了与当前环境相关的两个或多个选择。在较小的屏幕上,动作表会从屏幕的底部滑上去;在较大的屏幕上,动作表会以弹出式的方式一次性出现。 在执行一个…

    Linux 2023年6月7日
    0100
  • Dockerfile 使用 SSH docker build

    如果在书写 Dockerfile 时,有些命令需要使用到 SSH 连接,比如从私有仓库下载文件等,那么我们应该怎么做呢? Dockerfile 文件配置 为了使得 Dockerfi…

    Linux 2023年6月7日
    092
  • Redis集群的节点通信原理

    Redis集群搭建中,数据如何在节点分布的原理,下面来介绍一下节点之间是如何进行通信(节点握手) 一、基础通讯原理 1、维护集群的元数据的两种方案介绍及对比 在分布式存储中需要提供…

    Linux 2023年5月28日
    0140
  • 白话电子签章原理及风险

    因为业务需要近来在对接一个线上的电子签章平台, 签完的效果就是在PDF上盖一个红色的章。内部过程沟通中发现,对这个红色章背后的证明逻辑,技术原理,能够了解的比较清楚的人还是很少的。…

    Linux 2023年6月13日
    097
  • chmod 报错 changing permissions of ‘xxx’: Operation not permitted

    chmod的底层实现是 chattr命令,用此命的功能更为强大,甚至可以锁定文件,即使root用户也操作不了此文件。 先使用lsattr查看文件属性 `bashlsattr tem…

    Linux 2023年6月13日
    0103
  • 离线版centos8环境部署迁移监控操作笔记

    嗨咯,前两天总结记录了离线版centos8下docker的部署笔记,今天正好是2021年的最后一天,今天正好坐在本次出差回家的列车上,车上没有上面事做,索性不如把本次离线版cent…

    Linux 2023年6月14日
    0106
  • cobbler部署

    cobbler cobbler 一、cobbler简介 二、cobbler对应关系 三、cobbler工作原理 cobbler部署 进行测试 web界面自动安装 一、cobbler…

    Linux 2023年6月6日
    0119
  • springboot mybatis层整合

    1、导入Mybatis包 使用maven 2、配置数据库连接 注意:classpath后不需要加 / 3、测试 4、建立实体类,可使用Lombok来简化 5、 创建mapper目录…

    Linux 2023年6月14日
    088
  • 20191223-Exp3-免杀原理

    Exp3-免杀原理 姓名:张俊怡 学号:20191223 课程:网络对抗技术 一、实践内容 方法 正确使用msf编码器,使用msfvenom生成如jar之类的其他文件 veil,加…

    Linux 2023年6月8日
    0130
  • 使用kubectl管理Kubernetes(k8s)集群:常用命令,查看负载,命名空间namespace管理

    服务器版本 docker软件版本 CPU架构 CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 x86_64…

    Linux 2023年6月7日
    0162
  • Linux ARM中断控制器注册(4)【转】

    本文以S5PV210芯片为参照,S5PV210的中断控制器采用了ARM VIC(Vectored Interrupt Controller,PL192 ,ARM PrimeCell…

    Linux 2023年6月8日
    086
  • MybatisPlus拓展——实现多数据源操作

    多数据源 适用:一般工作时候会有多个数据库,每个库对应不同的业务数据。程序如果每次数据都访问同一个数据库,该数据库压力很大访问会很慢。 1、导入依赖 com.baomidou dy…

    Linux 2023年6月7日
    080
  • 一位美国教授的科研诀窍:每周工作100小时(转)

    今天看到了,Xinyu Zhang 的一篇文章,深受启发,转载一下。 OSU计算机系一位教授到北大讲座,学生提问:您组里发了那么多牛paper,有什么诀窍? 教授回答:我们组里,从…

    Linux 2023年6月14日
    0105
  • git 那些事儿 —— 基于 Learn Git Branching

    推荐一个 git 图形化教学网站:Learn Git Branching,这个网站有一个沙盒可以直接在上面模拟 git 的各种操作,操作效果使用图形的方式展示,非常直观。本文可以看…

    Linux 2023年5月27日
    0131
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球