Django——中间件及用法

1.django内置中间件

# 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能

# django内置中间件
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',#注释之后就拿不到request.session了
    'django.middleware.common.CommonMiddleware',#重定向
    'django.middleware.csrf.CsrfViewMiddleware',#注释之后发post请求会被禁止
    'django.contrib.auth.middleware.AuthenticationMiddleware',#如果'django.contrib.sessions.middleware.SessionMiddleware'注释了,那这个也要注释,不然会报错
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',

2.自定义中间件

1 自定义步骤:
    -写一个类,继承MiddlewareMixin
    -里面写方法process_request(请求来了,一定会触发它的执行)
    -在setting中配置(注意,放在前和放在后)
        MIDDLEWARE = [
            ...
            'app01.mymiddle.MyMiddleware1',
            ...
        ]

3.自定义中间件 代码

#settings.py
略
#urls.py
略
#mymiddle.py

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render,HttpResponse

class MyMiddleware1(MiddlewareMixin):
    # 所有的请求来了,都会走到它
    def process_request(self,request): # request就是当请求的request对象
        print('请求来了')

    # 所有的请求走了,都会执行它
    def process_response(self, request, response):
        print('请求走了')
        return response

#views.py

from django.shortcuts import render,HttpResponse,redirect
 def index(request):
     print('我是视图函数')
     return HttpResponse('ok')

4.中间件需要知道的用法

process_request,process_response,process_view,process_exception

1 process_request(request对象)
2 process_response(request对象,response对象)
'''
如这个网址:127.0.0.1/user/... 加cookie name=lili
利用process_request 和process_response
因为已经有request对象了,先用request.get_full_path()取到所有路径,
判断路径如果是127.0.0.1/user/...就加上cookie,用reponse.set_cookie('name','lili')不是就不做处理
'''
3 多个中间件,执行顺序是什么?(!!!记得写好中间件)
    -请求来的时候从上往下执行:process_request
    -请求走的时候,从下往上执行:process_response

4 process_request可以干什么?
    -写一个中间件,不管前端用什么编码,在requset.data中都有post的数据
    -频率限制(限制某个ip地址,一分钟只能访问5次)
    -登录认证(只要没登录,重定向到login路径)、
    -记录用户访问日志(ip,时间,访问路径)

5 process_response可以干什么?内部有response对象
    -统一给所有(某几个路径)加cookie
    -统一给所有(某几个路径)加响应头

6 process_view 路由匹配成功和视图函数执行之前执行(callback就是视图函数)
    def process_view(self, request, callback, callback_args, callback_kwargs):
            # print(callback)
            # print(callback_args)
            # print(callback_kwargs)
            #
            res=callback(request)
            #
            print("中间件1的process_view")
            return res
7 process_exception 视图函数出错,会执行它(全局异常捕获)(可以记录日志,哪个ip地址,访问哪个路径出的错,利用request对象)
    # 全局异常捕获,返回4开头的
    def process_exception(self, request, exception):
        print(exception)
        return render(request,'error.html')
8 process_template_response(self,request,response)
   该方法对视图函数的返回值有要求,必须是一个含有render方法类的对象,才会执行此方法

5.用法中3的代码

#urls.py
urlpatterns = [
    path('', views.index),
]
#index.html
创建一个index.html就行
#settings.py
MIDDLEWARE = [
    ...
     'app01.mymiddle.MyMiddleware1',
     'app01.mymiddle.MyMiddleware2',
    ...
]

#mymiddle.py
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render,HttpResponse

class MyMiddleware1(MiddlewareMixin):
    # 所有的请求来了,都会走到它
    def process_request(self,request): # request就是当请求的request对象
        print('请求来了1')
        # print(request.session)
        # 可不可以返回?必须返回HttpResponse的对象
        # return HttpResponse('我不让你访问')
    # 所有的请求走了,都会执行它
    def process_response(self, request, response):
        print('请求走了1')
        return response #必须返回

class MyMiddleware2(MiddlewareMixin):
    # 所有的请求来了,都会走到它
    def process_request(self,request): # request就是当请求的request对象
        print('请求来了2')
        # print(request.session)
        # 可不可以返回?可以返回,但是视图函数就不走了
        # return HttpResponse('dsb')
    # 所有的请求走了,都会执行它
    def process_response(self, request, response):
        print('请求走了2')
        return response
#views.py
from django.shortcuts import HttpResponse

def index(request):
    print('我是视图函数')
    return HttpResponse('ok')

6.用法中6的代码

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render,HttpResponse

class MyMiddleware1(MiddlewareMixin):
    # 所有的请求来了,都会走到它
    def process_request(self,request): # request就是当请求的request对象
        print('请求来了1')
        # print(request.session)
        # 可不可以返回?必须返回HttpResponse的对象
        # return HttpResponse('我不让你访问')

    # 所有的请求走了,都会执行它
    def process_response(self, request, response):
        print('请求走了1')
        return response

    # 路由匹配成功,视图函数执行之前执行
    def process_view(self, request, callback, callback_args, callback_kwargs):
        # print(callback) #指的就是视图函数
        # print(callback_args) #()
        # print(callback_kwargs)#{}
        #相当于视图函数装饰器 res=callback(request)  return res ,写上它,执行顺序会变,会先执行视图函数,再执行。不加它先执行这里再 执行 视图函数
        # res=callback(request)
        #
        print("中间件1的process_view")
        # return res

class MyMiddleware2(MiddlewareMixin):
    # 所有的请求来了,都会走到它
    def process_request(self,request): # request就是当请求的request对象
        print('请求来了2')
        # print(request.session)
        # 可不可以返回?
        # return HttpResponse('dsb')

    # 所有的请求走了,都会执行它
    def process_response(self, request, response):
        print('请求走了2')
        return response
'''
执行顺序:
请求来了1
请求来了2
中间件1的process_view
我是视图函数
请求走了2
请求走了1

加上call_back  执行顺序:
请求来了1
请求来了2
我是视图函数
中间件1的process_view
请求走了2
请求走了1
'''

7.用法中7的代码

#views.py
from django.shortcuts import render, HttpResponse, redirect
def index(request):
    print('我是视图函数')
    a
    return HttpResponse('ok')

#error.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
404
</body>
</html>

#mymiddle.py
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render,HttpResponse

class MyMiddleware1(MiddlewareMixin):
    # 所有的请求来了,都会走到它
    def process_request(self,request): # request就是当请求的request对象
        print('请求来了1')
    # 所有的请求走了,都会执行它
    def process_response(self, request, response):
        print('请求走了1')
        return response
    # 路由匹配成功,视图函数执行之前执行
    def process_view(self, request, callback, callback_args, callback_kwargs):
        print("中间件1的process_view")

class MyMiddleware2(MiddlewareMixin):
    # 所有的请求来了,都会走到它
    def process_request(self,request): # request就是当请求的request对象
        print('请求来了2')

    # 所有的请求走了,都会执行它
    def process_response(self, request, response):
        print('请求走了2')
        return response

    # 全局异常捕获,返回4开头的报错信息(可以让用户觉得自己错误,而不是服务器内部错误)
    def process_exception(self, request, exception):
        print(exception) # name 'a' is not defined
        print('exception') #exception
        return render(request,'error.html')
'''
执行顺序:
请求来了1
请求来了2
中间件1的process_view
我是视图函数
name 'a' is not defined
exception
请求走了2
请求走了1
'''
(0)

相关推荐

  • Django——视图层(请求&响应对象,cbv和fbv,文件上传)

    一.视图层之请求对象 def index(request): ''' request:django封装的对象,它的类是WSGIRequest,它里面包含了所有http请求的东西 ''' print(r ...

  • Django中间件案例由浅入深+实战

    WEB前端开发社区 昨天一般概念中间件允许您在一个浏览器的请求在到达Django视图之前处理它,以及在视图返回的响应到达浏览器之前处理这个响应.Django为每个项目保留一个中间件列表.您可以在设置文 ...

  • Django自定义中间件及其实例应用

    WEB前端开发社区 昨天 我们知道中间件的本质是一个 Python 类,它在视图执行之前与执行之后利用"钩子"函数做一些操作,也就是说所有的请求从开始进来以及最后返回响应都要经过中 ...

  • Django 实战3

    Django 实战3

  • Django——auth

    一.auth组件介绍 可以实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,内置了强大的用户认证系统--auth,它其实就是一个app 二.内置属性方法 注意:在用属性方法前,必须进行数据库 ...

  • 中间件:ElasticSearch组件RestHighLevelClient用法详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.基础API简介 1.RestHighLevelClient RestHighLevelClient的API作为ElasticSearch备 ...

  • EXCEL Range用法集

    来源:博客园 网址:https://www.cnblogs.com/aademeng/articles/12952659.html 标签:Execl,Range,用法 收藏:株野 作者:天涯海角路 日 ...

  • 地支藏干用法

    地支藏干歌诀 子宫癸水在其中,丑癸辛金己土同: 寅宫甲木兼丙戊,卯宫乙木独一苗, 辰藏乙戊三分癸,巳中庚金丙戊丛: 午宫丁火己土同,未宫乙己丁共宗: 申位庚金壬水戊,酉宫辛金独丰隆: 戌宫辛金及丁戊, ...

  • 身和体的定义及用法

    ​易山/文 盲派命法,身旺不旺无所谓,体旺就行,体旺也能做事. 身:指日干. 体:指印比食伤禄(除财官以外的神). 身和体是取得财官的工具. 我的体能制住财官,我能踏实干事,能担当.制不住财官,偷奸耍 ...

  • 中学英语16种时态完美精讲(每一种用法配一例句)

    中学英语时态共有16种,分别是一般现在.一般过去.一般将来.过去将来时,以及这四者的进行时.完成时和完成进行时. 在不同的时态中,动词都会发生相应变化,时间状语的运用也会有所不同.究竟怎样区分不同时态 ...

  • 附子理中丸、桂附理中丸、枳实理中丸有什么区别?用法都在这了

    附子理中丸、桂附理中丸、枳实理中丸有什么区别?用法都在这了

  • 2.6 多条件“或”函数or的用法

    多条件"或"函数or的用法