默认中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
# 为request/response提供了几种xss脚本过滤的安全改进,无它不安全
'django.contrib.sessions.middleware.SessionMiddleware',
# 开启session会话支持,无它无session
'django.middleware.common.CommonMiddleware',
# 基于APPEND_SLASH和PREPEND_WWW的设置来重写URL,
# 如果APPEND_SLASH设为True,并且初始URL 没有以斜线结尾以及在URLconf 中没找到对应定义,这时形成一个斜线结尾的新URL;
# 如果PREPEND_WWW设为True,前面缺少 www.的url将会被重定向到相同但是以一个www.开头的ur
'django.middleware.csrf.CsrfViewMiddleware',
# 添加跨站点请求伪造的保护,通过向POST表单添加一个隐藏的表单字段,并检查请求中是否有正确的值,无它无csrf保护
'django.contrib.auth.middleware.AuthenticationMiddleware',
# 在视图函数执行前向每个接收到的user对象添加HttpRequest属性,表示当前登录的用户,无它用不了request.user
'django.contrib.messages.middleware.MessageMiddleware',
# 开启基于Cookie和会话的消息支持,无它无message
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# 对点击劫持的保护
]
自定义中间件
钩子方法的种类
需要继承 django.utils.deprecation.MiddlewareMixin
这个类
可以重写的5个方法:
1、process_request(self,request) # django 处理请求之前,会执行该方法
2、process_view(self, request, callback, callback_args, callback_kwargs)
3、process_template_response(self,request,response)
4、process_exception(self, request, exception)
5、process_response(self, request, response) # django返回响应之后,执行该方法
自定义中间件
class SimMiddleware(MiddlewareMixin):
def process_request(self, request):
"""
处理请求前: 在每个请求上,request对象产生之后,url匹配之前调用,返回None或HttpResponse对象
"""
print('before request=====', request)
def process_view(self, request, view_func, *view_args, **view_kwargs):
"""
:param view_func: Django即将使用的视图函数,它是实际的函数对象,而不是函数的名称作为字符串
:param view_args: 将传递给视图的位置参数的列表
:param view_kwargs: 将传递给视图的关键字参数的字典;
view_args和view_kwargs都不包含第一个视图参数(request)
"""
# 处理视图前:在每个请求上,url匹配之后,视图函数调用之前调用,返回None或HttpResponse对象
print('before view=======')
def process_template_response(self, request, response):
# 在视图函数执行完后立即执行的, 执行 该 函数有一个前提条件,那就是视图函数返回的对象是一个 TemplateResponse 对象或等价方法, 直接返回render函数无效)
print("render template=======")
return response
def process_exception(self, request, exception):
# 这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象
print("raise exception=======")
return HttpResponse(exception)
def process_response(self, request, response):
# 处理响应后:视图函数调用之后,所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
print('after response>>>>>', response)
return response
注册中间件
在django项目的settings模块中,在 MIDDLEWARE_CLASSES
变量中添加自定义中间件
MIDDLEWARE = [
...
'book.middleware.my_middleware', # book为应用名,middleware为文件名
'book.middleware.SimMiddleware'
]
模板视图
class Index(View):
def get(self, request):
print("Index============")
return TemplateResponse(request, 'index.html')