当前位置: 首页 > news >正文

Django-(3)

内容概览

  • Django请求生命周期流程图
  • 路由匹配
  • 反向解析
  • 路由分发
  • 名称空间
  • 用户管理系统代码编写逻辑

Django请求生命周期流程图

在这里插入图片描述

  1. 用户在浏览器中输入url发送请求
  2. django封装socket的wsgi服务器接收到请求将数据拆分发送给中间件
  3. 由中间件传递给路由层,分发到对应的视图层
  4. 调用models中表对象,通过orm拿到数据库数据
  5. 同时拿到templates中相应的模板进行渲染
  6. 然后传给中间件中,中间件再传递给wsgi服务器封装
  7. 发送给浏览器

路由匹配

path(‘网址后缀’,函数名)
一旦网址后缀匹配上了就会自动执行后面的函数
并结束整个路由的匹配

路由结尾的斜杠

默认情况下,不写斜杠django会做第二次处理
第一次匹配路由匹配不上,会让浏览器添加斜杠再次请求
django配置文件中可以修改是否自动添加斜杠
settings:

APPEND_SLASH = False  # 默认为True

path转换器

当网址后缀不固定时,可以使用转换器来匹配

path('func/<int:id>/', views.func)
<int:id>:转换器匹配到的内容只能够是int类型,然后会当做视图函数的关键字参数传入
有多少个转换器,那么视图参数的形参个数和名字也要一一对应
def func(request, id):
	pass
"""
int:IntConverter()
path:PathConverter()
slug:SlugConverter()
str:StringConverter()
uuid:UUIDConverter()
"""

re_path正则匹配

re_path(‘正则表达式’, 函数名)
只要网址后缀能够匹配上正则就会自动执行后边的函数
并结束整个路由的匹配

re_path('func/',view.func)
"""
如果直接写不加限制条件,那么无论网址的前后有什么,只要中间能够匹配上都可以执行后边的函数
eg:/aaabbbfunc/aaabbb/
所以需要加上限制条件
"""
re_path('^func/$', views.func)

正则匹配之无名分组

当网址后缀不固定的时候,就需要用到正则中的分组了

re_path('^func/(\d+)/', views.func)
正则表达式匹配到没有起名的分组会当做视图函数的位置参数传递给视图函数

正则匹配之有名分组

正则匹配也可以传递关键字参数

re_path('^func/(?P<id>\d+)/', views.func)
正则表达式匹配到有起别名的分组会当做视图参数的关键字参数传递给视图函数

django版本区别

在django1.11中,只支持正则匹配,并且方法是url ()
而django2及以上,可以使用path()、re_path();re_path()等同于url ()

反向解析

如果html页面上的路由都是直接写死固定了,一旦路由改变,那么所有的相关页面链接都会失效
反向解析:返回一个结果,此结果可以访问到对应路由

# 路由对应关系起别名
path('register/', views.register, name='reg_view')

# 使用反向解析语法
"""html页面"""
{% url 'reg_view' %}
"""后端"""
from django.shortcuts import reverse
reverse('reg_view')
# 使用反向解析,只要路由的别名不更改,那么就能访问到对应路由

有名无名反向解析

当路由中有不确定的匹配因素,那么反向解析时需要提前手动给出不确定因素指定类型与个数的具体的值

path('func/<int:id>', views.func, name='fn_id')
"""html页面"""
{% url 'fn_id' 111 %}
"""后端"""
reverse('fn_id', args=(111,))

路由分发

django中每个应用都可以有自己独立的urls.py、templates文件夹、static文件夹
能够让基于django开发的多个应用完全独立

# 项目同名文件夹下的urls.py为总路由,主要作用就是判断访问的是哪一个应用,然后分发给该应用的子路由做处理
path('app01/', include('app01.urls'))  # 只要网址后缀为app01/,那么就将app01/后边的后缀分发给app01下的urls做处理
path('app02/', include('app02.urls')) 
# 这是简写方式,标准写法需要先导入相应应用的urls文件,再写入include的括号中
from app02 import urls
path('app02/', include(urls))

# 子路由接收剩余的后缀,再判断是否有对应视图函数
path('func01', views.func01)  # app01
path('func01', views.func01)  # app02
"""当项目特别大,应用特别多的时候,可以使用路由分发,非常方便"""

名称空间

在使用路由分发的场景下,多个应用在涉及到反向解析起别名,名字冲突的时候无法正常解析

# 总路由
path('app01/', include('app01.urls'))
path('app02/', include('app02.urls'))

# app01路由
path('func/', views.func, name='fn')

# app02路由
path('func/', views.func, name='fn')

"""
此时调用fn只会是app02
有两种解决方式
"""
# 方式1:名称空间
path('app01/', include(('app01.urls', 'app01.urls'), namespace='app01'))  # 创建一个名称空间,后边使用的时候需要加上名称空间使用
"""html页面"""
{% url 'app01:fn' %}
"""后端"""
reverse('app01:fn')

# 方式二:规定使别名不冲突
"""保证django项目下没有重复的别名,例如在别名前加上应用的前缀即可"""

用户管理系统代码逻辑

  • 数据添加
    先编写对应html文件
    然后在urls.py中添加一个路由,然后到views.py中编写函数
    函数中先判断当前是GET请求还是POST请求
    如果是GET请求直接将数据添加界面返回出去
    如果是POST请求则接收到提交数据,使用orm添加到数据库中,然后重定向返回主页面
  • 数据编辑
    先编写对应html文件
    然后在urls.py中添加一个路由,然后到views.py中编写函数
    在主页面使用GET请求携带需要编辑对象的id值
    函数中先判断当前是GET请求还是POST请求
    如果是GET请求将html页面返回出去
    如果是POST请求则接收提交数据,使用orm修改当前用户信息到数据库中,然后重定向返回主页面
  • 数据删除
    在主页面使用GET请求携带需要编辑对象的id值
    在urls.py中添加一个路由,然后到views.py中编写函数
    使用orm通过id值直接删除数据库中用户信息
    然后重定向到主页面

相关文章:

  • HyperLynx(十五)多板仿真
  • ElasticSearch(四):ES nested嵌套文档与父子文档处理
  • java 基于springboot员工实训项目管理系统
  • SaaS行业的六大安全问题
  • Geoserver+Cesium 发布带样式矢量数据
  • 【C语言】数据类型、存储类
  • 免关注阅读CSDN博客和复制代码(2022.9.1)
  • shell脚本(四)处理用户输入
  • 08 SpringMVC跨域请求
  • Mac下根目录和home目录的区别
  • 猿创征文|opencv对滤波的处理
  • 输入年月日判断是本年的第多少天
  • 每天一个前端小知识01——Webpack
  • 猿创征文|[C++ 从入门到精通] 5.一学就会的迭代器介绍与相关操作展示
  • Java项目:SSM场地预订管理系统
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【347天】每日项目总结系列085(2018.01.18)
  • 08.Android之View事件问题
  • C++11: atomic 头文件
  • HomeBrew常规使用教程
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Java 23种设计模式 之单例模式 7种实现方式
  • Java Agent 学习笔记
  • Netty 4.1 源代码学习:线程模型
  • Node 版本管理
  • Puppeteer:浏览器控制器
  • React+TypeScript入门
  • ReactNativeweexDeviceOne对比
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 爱情 北京女病人
  • 创建一种深思熟虑的文化
  • 力扣(LeetCode)22
  • 面试遇到的一些题
  • 扑朔迷离的属性和特性【彻底弄清】
  • 使用Swoole加速Laravel(正式环境中)
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 微服务核心架构梳理
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 智能合约Solidity教程-事件和日志(一)
  • 06-01 点餐小程序前台界面搭建
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​人工智能书单(数学基础篇)
  • $refs 、$nextTic、动态组件、name的使用
  • (LeetCode 49)Anagrams
  • (rabbitmq的高级特性)消息可靠性
  • (zt)最盛行的警世狂言(爆笑)
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (论文阅读40-45)图像描述1
  • (四) 虚拟摄像头vivi体验
  • (四)Controller接口控制器详解(三)
  • (转)linux下的时间函数使用
  • (转)四层和七层负载均衡的区别
  • **CI中自动类加载的用法总结