路由层

目录

  • 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)

大家都在看

  • 模型层

    准备阶段 django自带的sqlite3数据库,功能很少,并且针对日期类型不精确 准备步骤 数据库正向迁移命令(将类操作映射到表中) python3 manage.py make…

    Linux 2023年6月7日
    0107
  • Ubuntu18.04 显卡驱动安装(解决各种疑难杂症)

    步骤 下载驱动 准备工作 进行安装 检查安装 下载驱动 首先我们需要去官网下载显卡驱动 打开浏览器,在百度搜索框中搜索:显卡驱动 下载 在 手动搜索驱动程序一栏,根据自己的显卡进行…

    Linux 2023年6月14日
    0131
  • CNN卷积神经网络的构建

    1.卷积神经网络由输入层,卷积层,激活函数,池化层,全连接层组成. input(输入层)–conv(卷积层)–relu(激活函数)–pool(池…

    Linux 2023年6月6日
    0103
  • Kibana 7.15.x [error][savedobjects-service] [.kibana] Action failed with ‘Request timed out’. Retrying attempt 报错处理。

    1、报错 近日在windows平台使用7.15.2 的elasticsearch 和kibana 时候,在开启es cmd窗口后,kibana无法启动,报错误下。 log [09:…

    Linux 2023年6月6日
    0140
  • 高等代数:1 线性方程组的解法

    1 线性方程组的解法 1、线性方程组:左端为未知量x的一次齐次式,右端是常数。关键词:系数、常数项、n元线性方程组、解集 2、线性方程组的初等变换:1)把一个方程的倍数加到另一个方…

    Linux 2023年6月8日
    0122
  • 在使用amoeba连接数据库时,报错java.lang.Exception: poolName=slaves, no valid pools

    搭建3台MySQL服务器,完成主从复制,搭建一台amoeba服务器,完成MySQL的读写分离 问题描述: 问题1、 在服务搭建完毕后,利用客户机连接amoeba服务器登录数据库,无…

    Linux 2023年6月13日
    099
  • 爬虫

    简介: 浏览器发送http请求,去后端服务器获取到数据之后只能从浏览器中看,如果要把需要的数据保存到本地,存到我们自己库中就可以用到爬虫 百度本质就是一个大爬虫(搜索),在输入框中…

    Linux 2023年6月14日
    0118
  • SQL实战——02. 查找入职员工时间排名倒数第三的员工所有信息

    查找入职员工时间排名倒数第三的员工所有信息CREATE TABLE employees (emp_no int(11) NOT NULL,birth_date date NOT N…

    Linux 2023年6月14日
    0120
  • shell中的##*,%%*问题

    假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt 可以用${ }分别替换得到不同的值:${file#/}:删掉第一个 / 及其左边的字符串…

    Linux 2023年5月28日
    090
  • 【证券从业】金融基础知识-第五章 债券01

    注1:后续学习并整理到第八章,全书完结后再合并成一个笔记进行源文件分享 注2:本章内容巨多,大约分为两篇文章记录消化 posted @2022-06-08 01:30 陈景中 阅读…

    Linux 2023年6月13日
    091
  • python_列表

    列表创建 列表类似数组,但是以一对方括号 []作为符号,同时支持-1到-n的下标访问。列表中包含的是元素值的引用 并且,列表中的元素可以不是同一类型的 列表的创建: listNew…

    Linux 2023年6月7日
    0160
  • Redis缓存穿透、缓存击穿、缓存雪崩

    Redis缓存穿透、缓存击穿缓存雪崩 redis常被用于作为后台数据库的缓存,缓存一些热点访问数据,根据局部性原理,缓存能够处理大部分请求。当请求数据未命中缓存时,才会引起对数据库…

    Linux 2023年6月13日
    0121
  • 链栈

    #pragma once #ifndef _LINKSTACK_ #define _LINKSTACK_ #include using namespace std; typedef…

    Linux 2023年6月7日
    091
  • 如何在 pyqt 中捕获并处理 Alt+F4 快捷键

    前言 如果在 Windows 系统的任意一个窗口中按下 Alt + F4,默认行为是关闭窗口(或者最小化到托盘)。对于使用了亚克力效果的窗口,使用 Alt + F4 最小化到托盘,…

    Linux 2023年6月7日
    0136
  • nginx-http响应头安全策略

    从nginx的http头文件的方面,利用参数设置开启浏览器的安全策略,来实现相关的安全机制。 add_header Content-Security-Policy "de…

    Linux 2023年6月6日
    0117
  • 2:数据和提取

    Mail 新的小插件 tldr tldr简化了烦琐的 man的输出帮助信息,只列出关键的语法信息、例子,方便用户使用。 npm install -g tldr vim 的语法 ^$…

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