• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
菩提叶子
博客园    首页    新随笔    联系   管理    订阅  订阅
django中间件

一、可用的中间件

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、激活中间件

添加到MIDDLEWAREDjango 设置中的列表中

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是TemplateResponseDjango 视图或中间件返回的对象,在视图完成执行后立即调用,如果响应实例有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,'测试')

 

posted on 2022-11-10 18:26  菩提叶子  阅读(61)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3