目录 模版引擎 中间件(重点) 自定义中间件 MVC 和 MTV 过程: 模版引擎 基本数据类型的渲染(重要) 字符串,整数,小数 列表,字典 列表套字段(pymysql) 不知道返回的类型,就多
目录
- 模版引擎
- 中间件(重点)
- 自定义中间件
- MVC 和 MTV
- 过程:
模版引擎
基本数据类型的渲染(重要)
- 字符串,整数,小数
- 列表,字典
- 列表套字段(pymysql)
- 不知道返回的类型,就多打印看一看
母版(重要)
- 后台布局管理页面(layout.html)
- 子版页面开头注明
{% extends ‘layout.html‘ %}
- 母版和子版页面使用对应的
{% block mycontent/mycss/myjs %}
导入模块 include(重要)
python: 导入模块 import mycustom django: 导入模块 {% include "niubi的页面" %} # 模块页面可以不需要html,head那些,只有你需要的内容就可以,因为他本身不需要被渲染,比如一个form表单 # 可以重复导入,会重复展示效果
导入模块与母版的区别
- 模版继承的是整个的页面,导入模块更多的是为了一些小组件的重复使用
内置函数
- 不建议使用,会降低模版的渲染效率,直接在views中处理好,传过来就可以了
举例:假设传来的参数名为name
函数使用方式 作用 展示效果 {{ name | upper }} 大写(实际上也是调用的python) JUNE {{ name | lower }} 小写 june {{ name | first | upper }} 拿到第一个字符,再让它大写 J {{ name | truncatewords: "3" }} 拿前面三个单词,剩下的是... 脑补自定义函数
- 在app中创建templatetags模块
- 创建任意 .py 文件,如:xxx.py
- 按照别人的规则来做,不要乱改名字,很容易出错
- 两种方式:
- 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', ]
此时可以通过前后端交互查看这些打印的顺序,判断中间件执行的顺序
# 总结 ''' 请求到达中间件之后,先按照正序执行每个注册中间件的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()
# 总结 ''' 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中独有