当前位置 : 主页 > 网页制作 > html >

day93-1 中间件,模版引擎,导入模块

来源:互联网 收集:自由互联 发布时间:2021-06-12
目录 模版引擎 中间件(重点) 自定义中间件 MVC 和 MTV 过程: 模版引擎 基本数据类型的渲染(重要) 字符串,整数,小数 列表,字典 列表套字段(pymysql) 不知道返回的类型,就多

目录

  • 模版引擎
  • 中间件(重点)
    • 自定义中间件
    • MVC 和 MTV
      • 过程:

模版引擎

  1. 基本数据类型的渲染(重要)

    • 字符串,整数,小数
    • 列表,字典
    • 列表套字段(pymysql)
    • 不知道返回的类型,就多打印看一看
  2. 母版(重要)

    • 后台布局管理页面(layout.html)
    • 子版页面开头注明{% extends ‘layout.html‘ %}
    • 母版和子版页面使用对应的{% block mycontent/mycss/myjs %}
  3. 导入模块 include(重要)

    python:
     导入模块
         import mycustom
    django:
     导入模块
         {% include "niubi的页面" %}    # 模块页面可以不需要html,head那些,只有你需要的内容就可以,因为他本身不需要被渲染,比如一个form表单
    
    # 可以重复导入,会重复展示效果

    导入模块与母版的区别

    • 模版继承的是整个的页面,导入模块更多的是为了一些小组件的重复使用
  4. 内置函数

    • 不建议使用,会降低模版的渲染效率,直接在views中处理好,传过来就可以了

    举例:假设传来的参数名为name

    函数使用方式 作用 展示效果 {{ name | upper }} 大写(实际上也是调用的python) JUNE {{ name | lower }} 小写 june {{ name | first | upper }} 拿到第一个字符,再让它大写 J {{ name | truncatewords: "3" }} 拿前面三个单词,剩下的是... 脑补
  5. 自定义函数

    1. 在app中创建templatetags模块
    2. 创建任意 .py 文件,如:xxx.py
    3. 按照别人的规则来做,不要乱改名字,很容易出错
    4. 两种方式:
      • simple_tag:能传入多个参数
      • simple_filter:只能传入两个参数
# xxx.py
from django import template

register = template.Library()

@register.filter
def my_filter(val, args):
    return val + args

@register.simple_tag
def my_upper(val, args, args1):
    return val + args + args1
<!--test.html-->  
<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
 {% load xxx %}
 {{ name | my_filter:'haha'}}  <!--注意:后面的my_filter:'haha'中间不能有一个空格-->
 {% my_upper 'haha' 'lala' 'hehe' %}  <!--参数间空格隔开-->
</body>
</html>

中间件(重点)

django请求生命周期完整版,中间件类似于django的门卫,数据在进入和离开时都需要经过中间件

  • 在前端和后台之间,称为中间件
  • 原理:在数据提交之前,进行一些检验,例如客户端IP的合法性的校验,就可以放在中间件中。
  • 本质:类
# Django的settings
# 可以通过from...import的方式查看一下
from django.middleware.security import SecurityMiddleware
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

中间件的共性:

  • 都需要继承 MiddlewareMixin
  • 都至少需要实现 process_request process_response两个方法

自定义中间件

# 直接在django文件夹下,新建一个py文件
# m1.py
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse

class M1(MiddlewareMixin):

    def process_request(self, request):
        # 可以在这里做一些IP的验证之类的
        print('m1.process_request')
        # return HttpResponse('回去吧!')

    def process_response(self, request, response):
        print('m1.process_response')
        return response

    def process_view(self, request, view_func, args, kwargs):

        print('m1.process_view')
        # return HttpResponse('回去吧!')
# m2.py
from django.utils.deprecation import MiddlewareMixin

class M2(MiddlewareMixin):

    def process_request(self, request):
        print('m2.process_request')

    def process_response(self, request, response):
        print('m2.process_response')
        return response

    def process_view(self, request, view_func, args, kwargs):
        print('m2.process_view')
# 在settings的MIDDLEWARE中添加自定义的中间件
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'm1.M1',
    'm2.M2',
]

此时可以通过前后端交互查看这些打印的顺序,判断中间件执行的顺序

ZOZRu4.png

# 总结
'''
   请求到达中间件之后,先按照正序执行每个注册中间件的process_request方法,process_request方法返回的值是None,就依次执行,如果返回的值是HttpResponse对象,不再执行后面的process_request方法,而是执行当前对应中间件的process_response方法(注意不是掉头执行所有的process_response方法),将HttpResponse对象返回给浏览器。也就是说:如果MIDDLEWARE中注册了6个中间件,执行过程中,第3个中间件返回了一个HttpResponse对象,那么第4,5,6中间件的process_request和process_response方法都不执行,顺序执行3,2,1中间件的process_response方法。
'''

如果有process_view()

ZOZWDJ.png

# 总结
'''
process_request方法都执行完后,匹配路由,找到要执行的视图函数,先不执行视图函数,先执行中间件中的process_view方法,process_view方法返回None,继续按顺序执行,所有process_view方法执行完后执行视图函数。假如中间件3 的process_view方法返回了HttpResponse对象,则4,5,6的process_view以及视图函数都不执行,直接从最后一个中间件,也就是中间件6的process_response方法开始倒序执行。
'''

MVC 和 MTV

MTC只在python的django中独有

过程:

V(T) C(V) M(M) 举例 客户 服务员 厨子(使用原材料做饭) 逻辑过程 模版页面(html页面) 函数处理业务请求 数据库的相关操作 MVC views(模型) C:controller(控制器) model(模版页面) MTV template views model

分享图片

网友评论