一、可用的中间件
1、缓存中间件
UpdateCacheMiddleware
FetchFromCacheMiddleware
2、通用中间件
CommonMiddleware #规范化url
3、GZip中间件
#这个中间件应该放在任何其他需要读取或写入响应体的中间件之前,以便之后发生压缩。 #如果以下任何一项为真,它将不会压缩内容: #内容正文的长度小于 200 字节。 #响应已经设置了Content-Encoding标头。 #请求(浏览器)未发送Accept-Encoding包含gzip. #如果响应有ETag标头,则 ETag 被弱化以符合 RFC 7232#section-2.1。 #使用 gzip_page()装饰器将 GZip 压缩应用于单个视图。 GZipMiddleware
4、条件get中间件
ConditionalGetMiddleware #处理条件 GET 操作。如果响应没有ETag 标头,则中间件会根据需要添加一个标头。如果响应具有ETagor Last-Modified标头,并且请求具有If-None-Matchor If-Modified-Since,则响应将替换为 HttpResponseNotModified。
5、语言环境中间件
LocaleMiddleware #根据请求中的数据启用语言选择。它为每个用户定制内容
6、消息中间件
MessageMiddleware #启用基于 cookie 和基于会话的消息支持
7、会话中间件
SessionMiddleware #启用会话支持
8、站点中间件
CurrentSiteMiddleware #将site表示当前站点的属性添加到每个传入 HttpRequest对象
9、认证中间件
AuthenticationMiddleware #将user表示当前登录用户的属性添加到每个传入HttpRequest对象 RemoteUserMiddleware #用于利用 Web 服务器提供的身份验证的中间件 PersistentRemoteUserMiddleware #仅在登录页面上启用时,用于使用 Web 服务器提供的身份验证的中间件。
10、保护中间件
CsrfViewMiddleware #通过将隐藏的表单字段添加到 POST 表单并检查请求的正确值来增加对跨站点请求伪造的保护
11、X-Frame-Options
中间件
XFrameOptionsMiddleware #通过 X-Frame-Options 标头进行简单的点击劫持保护。
二、中间件的排序
SecurityMiddleware 如果您要打开 SSL 重定向,它应该位于列表顶部附近,因为这样可以避免运行一堆其他不必要的中间件。 UpdateCacheMiddleware 在那些修改Vary标题(SessionMiddleware, GZipMiddleware, LocaleMiddleware)之前。 GZipMiddleware 在任何可能更改或使用响应正文的中间件之前。 之后UpdateCacheMiddleware:修改Vary标题。 SessionMiddleware 在任何可能引发异常以触发错误视图(例如PermissionDenied)的中间件之前,如果您使用CSRF_USE_SESSIONS. 之后UpdateCacheMiddleware:修改Vary标题。 ConditionalGetMiddleware 在任何可能更改响应的中间件之前(它设置ETag 标头)。 之后GZipMiddleware它不会计算ETag压缩内容的标题。 LocaleMiddleware 最顶层之一,在SessionMiddleware(使用会话数据)和 UpdateCacheMiddleware(修改Vary标题)之后。 CommonMiddleware 在任何可能更改响应的中间件之前(它设置 Content-Length标头)。之前出现 CommonMiddleware并更改响应的中间件必须重置Content-Length。 接近顶部:它在APPEND_SLASH或 PREPEND_WWW设置为时重定向True。 之后SessionMiddleware,如果您使用CSRF_USE_SESSIONS. CsrfViewMiddleware 在任何假定 CSRF 攻击已被处理的视图中间件之前。 在调用中间件链之前RemoteUserMiddleware,或任何其他可能执行登录并因此轮换 CSRF 令牌的身份验证中间件。 之后SessionMiddleware,如果您使用CSRF_USE_SESSIONS. AuthenticationMiddleware 之后SessionMiddleware:使用会话存储。 MessageMiddleware After SessionMiddleware: 可以使用基于会话的存储。 FetchFromCacheMiddleware 在任何修改Vary标头的中间件之后:该标头用于为缓存哈希键选择一个值。 FlatpageFallbackMiddleware 应该靠近底部,因为它是最后的中间件类型。 RedirectFallbackMiddleware 应该靠近底部,因为它是最后的中间件类型。
三、中间件的使用
1、激活中间件
添加到MIDDLEWARE
Django 设置中的列表中
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', ]
2、request
请求来了触发,从上往下依次执行
def process_request(self, request): #如果返回None,就继续往下走 #如果返回四件套之一,直接就回去了 #在这里面写请求来了的一些判断 request.META.REMOTE_ADDR #客户端地址 request.META.HTTP_USER_AGENT # 客户端类型
3、response
请求走了触发,从下往上执行
def process_response(self, request, response): print('请求走了0000') return response #一定要return response
4、process_view()
调用视图前触发,返回一个None
或一个HttpResponse
对象。如果它返回None
,Django 将继续处理这个请求,执行任何其他process_view()
中间件,然后是适当的视图。如果它返回一个HttpResponse
对象,Django 不会费心调用适当的视图;它将对其应用响应中间件 HttpResponse
并返回结果。
def process_view(self, request, view_func, view_args, view_kwargs): # view_func 视图函数 # view_args 位置参数 # view_kwargs 关键字参数 print('我是process view') # 如果return None,会执行执行视图函数 #手动执行了视图函数 # response=view_func(request,view_args, view_kwargs) # 返回response,视图函数就不执行了 return HttpResponse('ddddd')
5、process_exception
exception
是 Exception
视图函数引发的对象,当视图引发异常时 Django 调用,返回一个None
或一个 HttpResponse
对象。如果它返回一个 HttpResponse
对象,则将应用模板响应和响应中间件,并将结果响应返回给浏览器。否则,将启动默认异常处理。
def process_exception(self, request, exception): #记录错误日志 print(exception) print('出错了')
6、process_template_response
request
是一个HttpRequest
对象。response
是TemplateResponse
Django 视图或中间件返回的对象,在视图完成执行后立即调用,如果响应实例有render()
方法,则表明它是 aTemplateResponse
或等效的。返回一个实现render
方法的响应对象。可以通过response更改response.template_name
来改变给定的response.context_data值,或者它可以创建并返回一个全新的 TemplateResponse
。
def process_template_response(self,request,response): print('我执行了') return responseclass Test: def __init__(self,status,msg): self.status=status self.msg=msg def render(self): import json dic={'status':self.status,'msg':self.msg} return HttpResponse(json.dumps(dic))def index(response): return Test(True,'测试')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通