目录
1. 前言
2. 基础中间件
3. 如何自定义中间件
4. 五种自定义中间件类型
4.1 process_request
4.2 process_view
4.3 process_response
4.4 process_exception
4.5 process_template_response
5. 最后
1. 前言
哈喽,大家好,我是小K,今天咋们分享的内容是:Django中的五种自定义中间件类型
在Django中,有一种特殊的存在,那就是中间件。
中间件是一种轻量化、可复用的Django组件,可以在请求之前、之后、视图之前或者响应之后作出一些动作,例如身份验证或者限流等。
本篇文章带你学会五种自定义中间件类型:
process_request、process_view、process_response、process_exception、process_template_response
2. 基础中间件
在学习自定义中间件时,我们先来看Django中已有的中间件:
django.middleware.security.SecurityMiddleware
: 这是Django的安全中间件,用于实施各种安全策略,例如设置HTTP头部以防止一些类型的攻击。
django.contrib.sessions.middleware.SessionMiddleware
: 这是用于处理会话的中间件,它允许您在请求之间存储和检索数据。
django.middleware.common.CommonMiddleware
: 这个中间件处理一般的HTTP请求和响应,例如添加适当的头部信息、处理URL重定向等。
django.middleware.csrf.CsrfViewMiddleware
: 这是用于处理跨站请求伪造保护的中间件,它确保每个POST请求都包含有效的CSRF令牌。
django.contrib.auth.middleware.AuthenticationMiddleware
: 这个中间件用于处理用户身份验证,它将用户对象添加到每个请求。
django.contrib.messages.middleware.MessageMiddleware
: 这个中间件用于处理Django消息框架中的消息。
django.middleware.clickjacking.XFrameOptionsMiddleware
: 这个中间件用于设置X-Frame-Options头,以防止点击劫持攻击。
3. 如何自定义中间件
在了解基础中间件之后,我们来看看如何自定义中间件:
我们可以随便创建一个文件,下面创建一个自定义模块:
‘
在这个模块中,我们单独定义类:
先不看具体的代码
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
class AuthenticateUser(MiddlewareMixin):
def process_request(self, request):
# request是请求相关所有的数据
if request.GET.get("token") == '123456': # 判断用户是否携带token,也就是是否登录
request.role = 'user' # 当前角色为普通用户
return
return HttpResponse('出错了')
def process_view(self, request, view, *args, **kwargs):
# request是请求相关所有的数据; view是试图函数; 路由参数*args, **kwargs
if 'admin' in request.path_info.split('/')[1] and request.role == 'user': # 如果当前url以admin开头的话,用户是无权限访问的
return HttpResponse("无权限访问")
return
def process_response(self, request, response):
# request是请求相关所有的数据
# response是试图函数返回的那个对象(封装了要返回到用户浏览器的所有数据)
response['name'] = 'jiaoxingk' # 在返回的时候,加入一些返回值信息
return response
def process_exception(self, request, exception):
print(request)
print(exception, type(exception))
return HttpResponse("错误了")
def process_template_response(self, request, response):
response.body = 'hello'
return response
接着,我们需要注册中间件,也就是通过字符串路径的形式,进行动态导入:
不知道为什么通过字符串可以动态导入的原理的话,可以参考我的这篇文章:
Python中的反射——getattr与动态导入模块
4. 五种自定义中间件类型
ok, 现在我们来具体看看以上自定义中间件的具体代码:
4.1 process_request
这是在请求到来之后,所执行的操作。
请求一来,最先做的应该是匹配相应的视图函数,而加上process_request,就代表在匹配之前,就截停了请求,开始执行操作
校验token,看是否登录(假装123456代表用户登录了)
如果登录了,就给该用户的角色定义为普通用户,然后返回空值,代表继续执行匹配
如果没有就提前截停请求,直接返回响应
4.2 process_view
此时,请求已经匹配到相应的视图函数,但是在执行视图函数之后,又做了一次操作:
这里,判断url的前缀是不是admin(管理员才能访问的),如果你只是普通用户的话,那么会没有权限继续访问了。
因此,这里就提前截停,返回值
4.3 process_response
现在,视图函数也已经执行完了,该返回给浏览器了
在返回之前,我加了一条响应信息,代表我当前的一个记录
这是浏览器里面可以看到的:
4.4 process_exception
如果在执行视图的时候,出现了异常,那么就会执行这里的语句:
4.5 process_template_response
这个比较特殊,主要对于视图函数返回内容渲染扩展。
process_template_response的调用前提是:
1. 在视图函数中如果返回的对象内部有一个render方法且可以被调用执行
2. process_template_response返回response参数(返回值)
3. 在自定义的MyReponse的render方法中必须返回HttpRespose
基本不常用这个。
5. 最后
好了,今日的中间件分享就到这里吧。
对于后两个中间件类型,一般是不常用的,主要还是process_request、process_view、process_response这三种用的比较多
了解到中间件的基础用法之后,咋们下一节开始深入研究它的底层源码啦,看看中间件到底是如何加载并且运行的。