模板
基本数据类型的渲染
{#基础数据类型的渲染#} {#1. 变量#} {{ name }} {#2. 列表#} {#通过点索引可以取值#} {{ list.0 }} {#for循环取值#} {% for l in list %} {{ l }} {% endfor %} {#3. 字典#} {#通过点key取值#} {{ dict.name }} {#for 循环取值,可以.items .values .keys#} {% for foo in dict.items %} {{ foo }} {% endfor %} {#4. 列表套字典#} {% for d in lists %} {{ d.name }} {% endfor %}
母版与子板
母版写好的页面,子板可以直接通过继承获得并使用
一般会在母版中占三个位置,留给子板的内容来添加
{% block mycss %} {#子板的css会添加到这#} {% endblock %} {% block mycontent %} {#子板的html代码会添加到这#} {% endblock %} {% block myjs %} {#子板的js代码会添加到这#} {% endblock %}
而我们的子板想要使用母版的内容,必须要继承,并且写与母版一直的占位符
{% extends "layout.html" %} {#这样就会继承layout.html文件#}
include导入
在项目开发中,如果我们写了一个样式或者js代码会被很多的页面引用,我们一般的做法
是把这写代码单独放到一个文件中,css代码通过link引入使用,js通过script的src引入使用
那当我们写了一个html的小组件用的非常多,我们也可以把他写到一个单独的文件中
在需要用的地方导入一下
{% include "small.html" %}
这样那个文件中的代码就会被全部导入过来,并且我们多次导入,他就会出现多次
内置函数与自定义函数
内置函数:模板语言提供给我们的函数
{#函数写在管道符后面#} {{ name | upper }}
自定义函数:需要我们在app中手动创建templatetags模块,然后里面文件名可以随意
自定义函数的两种方式
from django import template register = template.Library() # 第一种方式 @register.filter() def func(): pass # 第二种方式 @register.simple_tag() def fnn(): pass
自定义函数的使用方式
{#首先都需要把文件模块加载进来#} {% load aaa %} {#第一种定义方式的使用#} {{ name | func }} {#如果需要传参 函数名:参数 冒号前后不能由空格#} {{ name | func:"xxx" }} {#第二种方式的使用 通过{% %}使用#} {% fnn name "xxx" "qqq" %}
注:第一种方式filter 冒号前后不能有空格,并且传参只能传一个 ,第二种simple_tags可以传多个参数,通过空格隔开
中间件
django的请求生命周期
中间件基本组成与执行顺序
中间件说白了就是一个一个的类,他们都具备的两个方法是如下两个:
from django.utils.deprecation import MiddlewareMixin class MyMiddleWare(MiddlewareMixin): def process_request(self,request): pass def process_response(self,response): pass # 上面两个方法就是中间件类中必备的两个方法 def process_views(self, request, callback, callback_args, callback_kwargs):
pass
# 这个方法也是很常见的,但不是必须的
中间件必须添加到settings.py中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', ]
执行的顺序:
当中间件中都没有process_views函数时
当有request请求时,先从上到下执行中间件中的process_request函数,执行完接着执行
视图函数,视图函数执行完就从下到上执行中间件中的process_response函数
当process_request函数返回None时,中间件往下执行,当返回HttpResponse时,
这个中间件往下的中间件都不会执行,直接从这个中间件的process_response函数往回执行
当中间件中有process_view函数时
中间件的作用以及自定义中间件
中间件的主要作用时对request请求以及response响应做一些预处理,以及判断IP是否为白名单之类的应用
自定义中间件
1. 生成一个文件,在文件中生成类
from django.utils.deprecation import MiddlewareMixin class M1(MiddlewareMixin): def process_request(self,request): print("this is m1 request") def process_response(self,request,response): print("this is m1 response") return response
2. 放入到settings文件中的MIDDLEWARE列表中
import m1 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', ]
MVC与MTV
MVC与MTV本质都是一样的,都是项目目录结构的设计模式
MVC
m:models 存放表模型
v:views 存放html页面
c:controller 存放逻辑处理函数
MTV
m:models 存放表模型
t:templates 存放html页面
v:views 存放视图函数