首页 > 其他分享 >Django的生命周期

Django的生命周期

时间:2023-02-10 18:45:00浏览次数:408  
标签:生命周期 请求 request 视图 Django 模板 函数

目录

Django的请求生命周期

所谓Django的请求生命周期,直白的来说就是当请求来的时候和请求走的阶段中,Django的执行轨迹。
一个完整的Django生命周期:用户从客户端发出一条请求以后,首先会基于http协议去解析数据并封装,然后来到Nginx处理(nginx监听公网ip的某个端口,接到请求后,如果是静态资源,nginx直接获取该资源并返回给用户,如果是动态资源,nginx就将请求转发到uWSGI,使用协议一般是uwsgi),uWSGI接收到请求以后,通过将http协议转化为WSGI协议,和Django之间进行通信,此时,该条请求就真正的来到了后端之上,首先它会经过Django的第一道工序:中间件,(而所谓中间件,简单来说就是请求来和请求走的时候Django增加的一道工序,请求来和请求走的时候都要先经过中间件的处理,因此,也可以将中间件理解为Django提供的额外功能组件),在经过中间件以后,来到Django的第二道工序:路由层(urls.py)去筛选匹配符合符合请求命令后缀的地址,然后根据匹配到的地址去Django的第三道工序:视图层(views.py)找到对应的视图函数/视图类里的属性,之后去到第四道工序:模型层(models.py)通过orm操作去数据库中获取数据,拿到数据以后回到视图层(views.py)里对数据进行处理(序列化和反序列化),将处理后的数据返给Django的第五道工序:模板层(Templates),模板层接收到数据后,对数据进行渲染,之后再次经过视图层、路由层、中间件、uWSGI服务器、Nginx代理,最后将渲染的数据返还给客户端进行展示。

Django视图层

Django视图层即是Django的MTV设计模式中的Views,视图层主要接收来自客户端或者浏览器的请求,并最终返回响应,在Django中,主要的逻辑其实就是在视图层完成的。

而在Django中主要就是在通过在视图层编写视图函数来实现主要的业务逻辑,视图函数可以是python中的函数,也可以是类,视图函数接收到请求并最终返回响应,响应的类型可以是HTML文件,也可以是HTTP协议中的303重定向。

视图函数的编写

编写一个简单的视图函数:

from django.shortcuts import HttpResponse  # shortcuts模块中导入了http
from django.http import HttpResponse  # 两者是相同的效果

def test(request):
    return HttpResponse("测试Django")
  • HttpResponse:视图函数的响应类型
  • request:在Django中,规定了,视图函数至少拥有一个参数,第一个参数必须是request,request是HttpRequest请求类型的对象,由 request对象携带浏览器发送的请求信息,所以视图函数的第一个参数必须是request。
  • return视图响应:视图函数要返回响应内容,可以直接将返回的内容当做HttpResponse的对象返回给浏览器

视图函数执行过程

视图函数的执行过程:Django收到请求后,首先创建一个带有请求信息的HttpRequest对象,将HttpRquest的对象request作为第一个参数传递给视图函数,视图函数在接收到request对象以后,可以根据request获取到用户的请求方式,请求信息中的信息等,随后视图函数将继续向下执行,然后选择加载对应的视图,最后返还给HttpResponse对象给浏览器/客户端

Django模板层

Django的模板层,简单来说,就是展示给用户的前端界面,在Django的生命周期中提到了,请求是经过视图层,然后通过模型层去数据库取数据,最后将拿到的数据交给模板层进行渲染并展示给用户。

可以说模板层主要的任务就是接收来自视图层处理后的数据,并对数据进行渲染,随后返还给用户。

模板层与视图层交互

在视图层新建一个视图函数

from django.shortcuts import render

def index(request):
    content = {"value":"hello django"}
    return render(request,"hello.html",content)
  • render:render是视图层加载模板的一种方式,封装在django.shortcuts,使用render会将数据传递给html文件,随后在html文件里对数据进行渲染,返还给前段页面进行展示
  • content:模板层可以接受来自视图层传递的数据,数据必须组成字段的形式才能传递给模板层,这就是“模板传参”。

在Django中模板层,一般命名为templates,也即是Django的MTV设计模式中的T,当请求访问到视图函数时,就会去templates(只能叫这个名字)目录下找到对应的html文件,然后返还给前端页面进行展示,这是Django底层封装好的。

所以在将视图函数写好后,我们去templates目录下新建一个hello.html文件,并写入如下内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {{ value }}  # 使用变量替换user的值
</body>
</html>

模板语法

在Django中,存在一种DTL模板文件,所谓的DTL模板文件区别于一般的HTML文件,在Django中,HTML文件可以被Django编译,可以传递参数进去,实现数据的动态化,在编译完成后,生成一个普通的HTML文件,并返还给前段进行渲染展示。

而在模板文件中,提供了一种模板语法,可以让我们更快捷的拿到从视图层传递过来的数据,模板语法支持的数据类型包括(字符串、列表、字典等等),但是传递过来的数据只能是字典形式的。

变量

  • 字符串:直接进行展示,可以进行索引取值,即点索引的方式,eg:{{value.0}}(取字符串索引为0的字符)
  • 列表:列表同时也支持索引取值的方式,eg:{{list.0}}(取列表的第一个值)
  • 字典:字典取值也是通过点的方式,即点key值的方式,eg:{{dick.key}}(取指定key的values值),同时也支持字典的其他内置方法

过滤器

此外,在模板语法中,还有一种用的比较多的filter过滤器,eg:{{list|first}}(取列表的第一个值)

  • 设置默认值:{{dict.name|default=“json”}},取字典的name值,若没有则为json
  • 大小写转换:{{dict.name|upper}},取字典的name值,并全部转化为大写
  • 将内容转化为列表:{{dict.name|make_list}},取字典的name值,并转化为列表
  • 把文件的大小的数值转换为单位表示:{{dict.file_size|filesizeformat}} ,转化为文件格式大小
  • 随机抽取某个成员:{{dict.name_list|random}},随机从列表里选择一个

标签

标签在渲染的过程中提供了任意逻辑标签被{%%}包围,如下显示

{% csrf_token %}  # 免除csrf_token认证,浏览器自带的一种认证方式
{% for n in item %} # for循环,必须和endfor是成对出现
<li>{{ item.name }}</li>
{% endfor %}
{% if shop.state == 1 %}  # if流程控制,必须和endif同时出现
{% else %}
{% endif %}

模板继承

在Django中,提供了另外一种好用的方法-->模板继承,对于页面修改不大的界面来说,完全可以使用模板继承的方式,然后再各自对数据进行不同的渲染就能达成页面的不一样,可以很好的降低前端人员的开发成本

{% include "模板文件名"%}  # 模板嵌入
{% extends "base.html" %} # 模板继承,继承base.html父模板中的公共内容

父模板base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}{% endblock %}</title>  ###根据不同子界面的类型来添加
</head>
<body>
    <h1>{% block head %}{% endblock %}</h1>

</body>
</html>

子模板

{% extends "base.html" %}
{% block title %}子模板的title{% endblock %}
{% block head %}子模板的head{% endblock %}

标签:生命周期,请求,request,视图,Django,模板,函数
From: https://www.cnblogs.com/PyLy/p/17110023.html

相关文章

  • 生命周期
    一、生命周期有那些;发送请求是在created还是在mounted;          使用keep-alive后会增加两个声明周期;     activated与  deactivate......
  • Django 含有外键模型新增数据以及序列化
    https://www.cnblogs.com/SunshineKimi/p/14042914.htmlDjango原生实现外键classAppleModel(models.Model):id=models.AutoField(primary_key=True)app_name......
  • Django-ORM
    ORM由来让我们从O/R开始。字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。几乎所有的软件开发过程中都会涉及到对象和关系数据库。在用户层面和业务逻辑层面,......
  • docker搭建django+mysql
    1.本机项目迁移到linux系统中2.编写dockerfile内容如下 WOEKDIR 在容器中创建该目录COPY 复制本机当前目录下的requirements.txt文件 到容器drfproject......
  • Django生命请求周期
    Django的请求生命周期所谓Django的请求生命周期,直白的来说就是当请求来的时候和请求走的阶段中,Django的执行轨迹。一个完整的Django生命周期:用户从客户端发出一条请求以......
  • windows搭建django开发环境
    windows如何搭建django开发环境pycharm搭建django运行环境虚拟环境搭建前置条件,下载安装python如3.11.1下载安装pycharm社区版下载安装git在gitee上新建用户,搭建......
  • day70-生命周期
    生命周期<body><!--生命周期:1.又名:生命周期回调函数,生命周期函数2.vue在关键时刻帮我们调用的一些特殊名称的函数3.生命周期函......
  • 一个完整的软件项目开发流程,软件过程,软件生命周期
    一、开发流程图1、需求分析结构化分析面向对象分析2、原型设计结构化设计面向对象设计3、程序开发结构化开发面向对象开发4、程序测试二、软件生命周期软件分析1、问题定义......
  • 7 beforeCreate、created、beforeMount、mounted 生命周期函数
    Vue的生命周期函数(第一篇)​​介绍​​​​准备一个空白的页面​​​​自动执行函数的理解​​​​Vue3.x生命周期函数​​介绍本文我们主要讲解Vue3中的生命周期函数,生命周......
  • 8 创建、渲染、更新、销毁八个生命周期函数
    Vue的生命周期函数(第二篇)​​场景​​​​beforeUpdate和updated生命周期函数​​​​beforUnmount和unmounted生命周期函数​​​​Vue3中八个生命周期函数​​场景我们......