一、类试图装饰器
1、装饰器的作用
装饰器实质上就是一个函数,其可以让其他函数在不去改变任何代码的前提下增加额外的功能,装饰器的返回值是一个函数对象。
类视图使用装饰器
为类视图添加装饰器,可以使用两种方法。
为了理解方便,先定义一个为视图函数准备的装饰器(在设计装饰器时基本都以函数视图作为考虑的被装饰对象),以及一个要被装饰的类视图。
2、基本使用
案例一:为类试图中所有的视图方法都使用装饰器
需要在views.py中导入的模块 :
from django.utils.decorators import method_decorator from django.views import View from django.http import HttpResponse
views.py
from django.utils.decorators import method_decorator from django.views import View from django.http import HttpResponse def Game(func): print('今天去玩游戏') def wrapper(request): # 内部函数第一个参数同样也是一个Httprequest对象 print({'游戏一': '王者', '游戏二': '吃鸡'}) print('请求路径:%s' %request.path) return func(request) return wrapper '''类试图使用装饰器''' # 在method_decorator中,name参数的作用:限制装饰器所使用的范围 @method_decorator(Game, name='dispatch') # 当name参数的值为dispatch的时候表示为当前类试图中所有的视图方法都使用装饰器 class Things(View): # 为类中多个视图添加装饰器 def get(self, request): print('打篮球') return HttpResponse('篮球') def post(self, request): print('打排球') return HttpResponse('排球') def put(self, request): print('打羽毛球') return HttpResponse('羽毛球')
子路由文件:urls.py
from django.urls import path from app_1 import views urlpatterns = [ path('Happy', views.Things.as_view()) ]
运行时使用Postman发送对应的请求:
- 发送get请求
运行结果:
发送post请求
发送put请求
案例二:给类视图中单个视图函数使用装饰器
比如给类试图中的get函数使用装饰器,只需要将name='dispatch' 改为 name='get' 即可。其他的请求比如post请求,put请求不能使用装饰器
发送get请求
发送post请求
案例三:给类视图中多个视图函数使用装饰器
发送get请求
发送post请求
发送put请求
总结
导入的关键模块:method_decorator
from django.utils.decorators import method_decorator
装饰器装饰类中的所有方法
@method_decorator(装饰器, name=' ')
name的值 -> 'dispatch', 'get', 'post', 'put', 'delete', 'options'等
注意:name的值一定是一个字符串类型,而不是一个列表或者元组或集合等。
二、中间件的基本了解
1、Django中的中间件
Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。
2、中间件的作用
传话人,中间商。能够介入请求与响应的流程之间,可以对请求对象或者响应对象进行修改,修改了之后在传到下一个流程之中进程处理;
同时中间件也可以提升项目的一个安全性。
中间件的作用范围是整个请求响应的流程。
3、内置中间件的简介
用于安全证书验证:
'django.middleware.security.SecurityMiddleware'
session验证:
'django.contrib.sessions.middleware.SessionMiddleware'
通用中间件,核验请求的地址是否符合标准的请求格式:
'django.middleware.common.CommonMiddleware'
Csrf,用于防御跨站请求伪造攻击,当有表单数据的提交时,必须添加csrf_token,否则访问会被拒绝
'django.middleware.csrf.CsrfViewMiddleware'
用于验证用户登录,需要以来session中间件,也就是说session验证的中间件需要出现在此中间件之前
'django.contrib.auth.middleware.AuthenticationMiddleware'
消息处理中间件
'django.contrib.messages.middleware.MessageMiddleware'
欺骗点击防御,页面中可能嵌套了另一个页面,表面上点击响应的内容与实际点击响应的内容不一样
'django.middleware.clickjacking.XFrameOptionsMiddleware'
三、开发中间件
1、中间件的定义方法
- 定义一个中间件工厂函数,然后返回一个可以被调用的中间件。
- 中间件工厂函数需要接收一个可以调用的get_response对象。
- 返回的中间件也是一个可以被调用的对象,并且像视图一样需要接受一个request对象参数,返回一个response对象。
2、使用操作
案例一:使用一个中间件
在根目录中创建一个中间件目录,然后在其中创建一个py文件,即中间件文件
def outter(get_response): # get_response # 此处的代码在项目加载的时候就已经启动并执行 print('第一个中间件') def inner(request): # request表示请求对象 print('1') # 此处的代码是在视图处理之前执行 response = get_response(request) # get_response 直接视作一个视图 print('2') # 此处代码是在视图处理之后执行 return response return inner
在views.py中添加一个视图函数
def text(request): print('Hello Middleware') return HttpResponse('Middleware')
注册中间件
如果outter在中间件列表中并不是最后一个元素,即最后一个中间件的话,那么response就是下一个中间件。
如果outter在中间件列表中是最后一个元素,那么response就是一个视图。
运行:
案例一:使用多个中间件
先创建几个中间件文件,在里面写入函数
注册中间件
运行:
项目加载时
访问路径后
从以上结果可看到,项目加载时是从下往上,请求试图被处理前前中间件从上至下执行,请求试图被处理后,中间件从下至上执行
3、中间件的开发流程
中间件开发流程:
1.在项目中创建一个用于存放中间件代码的文件夹
2.在此文件夹中进行中间件的设计
3.中间设计好了之后,需要将自定义的中间件注册到项目之中
四、 知识点小补充(子应用的集中管理)
子应用的集中管理:
如果编辑器版本用的是21以下,需要在配置文件中添加上如下代码
import sys
sys.path.insert(0,os. path.join(BASE_DIR,'apps ' ))
如果编辑器变笨用的是21的同学,虽然不用添加上方代码,但需要将apps文件夹设置成根目录(source root)