之前,使用装饰器实现登陆校验,但是实际上有很多功能是需要所有页面都执行的,比如权限,当不同的用户访问同一个页面,根据权限不同返回的数据也应该不同。首先可以通过数据库查询限制返回的结果,这样的限制并不能完全对信息进行限制。
中间件:是用来处理Django请求的框架级别的钩子,他是一个轻量级的,低级别的插 件系统,用于全局范围改变django的输入与输出。
如果django项目存在中间件,用户发起请求,请求首先需要经过 【process_request】,【process_views】方法,当视图返回数据的时候,先经过 【process_exception】,【process_template_response】,【process_response】。
上述的五个可以是中间件当中的方法,可以全写,也可以写一部分。
使用中间件
1,在项目主目录定义middleware文件,编写中间件类
#中间件的元类,所有自定义的中间件都是基于当前类型进行重写的
from django.utils.deprecation import MiddlewareMixin
import os
import datetime
from Djangoshop.settings import BASE_DIR
class MiddlewareTest(MiddlewareMixin):
def process_request(self,request):
'''
:param request: 视图没有处理请求
:return:
'''
print('this is process_request')
def process_view(self,request,view_func,view_args,view_kwargs):
'''
:param request: 视图没有处理请求
:param view_func:视图函数
:param view_args:视图函数的参数,元组格式
:param view_kwargs:视图函数的参数,字典格式
:return:
'''
print('this is process_view')
def process_exception(self,request,exception):
'''
:param request:视图处理中的请求
:param exception: 错误
:return:
'''
# 报错日志
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
level = 'Error'
content = str(exception)
log_result = '%s [%s] %s'%(now,level,content)
file_path = os.path.join(BASE_DIR,'error.log')
with open(file_path,'a') as f:
f.write(log_result)
print('this is process_exception')
def process_template_response(self,request,response):
'''
:param request: 视图处理完成的请求
:param response: 视图处理完的响应
:return:
'''
print('this is process_template_response')
return response
def process_response(self,request,response):
'''
:param request: 视图处理完成的请求
:param response: 视图处理完的响应
:return:
'''
response.set_cookie('hhh','111')
print('this is process_response')
return response
2,在settings当中进行配置安装
中间件的配置是一个列表,中间件的加载和使用是有顺序的。
请求是自动触发的中间件
【process_request】【process_views】【process_response】。
process_request方法
Process_request 只有一个参数,是请求,这个请求的request和视图的request是一模一样的。但是在process_request当中编写代码可以影响到视图当中的request。
process_views方法
Process_view 拥有四个参数:
Request 是一个httpRequest对象
View_func django 即将使用的视图函数
View_args 视图函数元组参数
View_kwargs 视图函数的字典参数
无论是view_args还是view_kwargs都不会包含request
对比上述内容:
1、process_request 在 process_view之前执行
2、Process_request只接受request对象,process_view接受request对象和视图函 数及参数
process_exception方法
Process_exception方法只有在视图函数当中发生错误才会执行。
参数:Request 请求对象,,Exception 错误。
记录错误
process_template_response方法
当前方法只有在视图函数当中返回一个render对象才会执行,通常不会被使用。如果被使用,一定要返回一个response对象
当视图函数当中返回有render对象(或者是其他等价的response对象),改方法只会返回render对象返回的内容。
process_response方法
Process_response是中间件执行最后的方法,通常用于对响应内容进行再次处理,但是必须返回一个response对象。