Loading

第九篇:django中间件

Django中间件

相当于django的门户,只要是全局相关的功能,都可以考虑使用中间件来完成:

  • 全局用户身份校验
  • 全局用户访问频率校验
  • 用户访问黑名单
  • 用户访问白名单

在之前,我们通过装饰器的方式来对视图函数进行验证,但这样还是显得繁琐,我们可以通过中间件来实现。

django默认中间件

# settings.py
 
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',
]

当请求到达中间件的时候,会从上到下依次经过上面的七个中间件,这七个默认中间件会依次对请求进行处理,如果所有的中间件对请求处理完毕,没有问题的时候,这时请求才可以到达路由与视图层。如果有问题,请求就不会到达路由和视图层。

当请求渲染完毕,响应需要返回给browser客户端,此时响应会依次从下到上经过上面的七个中间件。

可以查看django默认的中间件,需要先进行导入:

from django.middleware.security import SecurityMiddleware  # 点SecurityMiddleware查看
# 源码部分代码
 
class SessionMiddleware(MiddlewareMixin):
    def process_request(self, request):
 
    def process_response(self, request, response):
 
class CsrfViewMiddleware(MiddlewareMixin):
    def process_request(self, request):
 
    def process_view(self, request, callback, callback_args, callback_kwargs):
 
    def process_response(self, request, response):
 
 
class AuthenticationMiddleware(MiddlewareMixin):
    def process_request(self, request):
 
 
# 可以发现都是继承了MiddlewareMixin类,类中的方法名也有相同的

django允许用户自定义中间件,并暴露给用户五个可以自定义的方法

自定义中间件

用户可以根据自己的需求自定义中间件
1、需要掌握的

  • process_request
    • 请求来的时候,会按照配置文件中注册的中间件从上往下的顺序依次执行每一个中间件里面的process_request方法,如果没有直接跳过执行下一个。
  • process_response
    • 响应走的时候,会按照配置文件中注册的中间件从下往上的顺序依次执行每一个中间件里面的process_response方法,该方法必须要有两个形参,并且需要将形参response返回。
    • 如果你内部自己返回了HttpResponse对象,会将返回给用户浏览器的内容替换成你自己的

2、需要了解的

  • process_view

    • 路由匹配成功执行视图函数之前触发
  • process_template_reponse

    • 视图函数返回的对象中必须要有render属性对应的render方法

    • # 视图函数中必须要这样写,否则触发
      
      def index(request):
          print('我是视图函数index')
          def render():
              return HttpResponse("你好啊 我是index里面的render函数")
          obj = HttpResponse("index")
          obj.render = render
          return obj
      
  • process_exception

    • 当视图函数报错的时候自动触发

我们观察django默认的中间件,发现它们都继承了MiddlewareMixin类,因此,我们可以通过类似的方式,定义我们自己的中间件。

中间件属于独立的功能,因此我们需要新建一个文件夹,用来放我们自定义的中间件,例如:mymiddleware,在文件夹下新建mymddle.py的文件,在文件中书写我们自定义的中间件。

from django.utils.deprecation import MiddlewareMixin
 
 
class Mymd1(MiddlewareMixin):
    def process_request(self, request):
        print('这里的代码会在视图函数之前执行')
        return HttpResponse('你好')  # 这里一旦有return那“请求”就不会走到路由层,而是直接返回给浏览器browser。
 
     def process_response(self, request, response):
        print('pass')
        return HttpResponse('你好')  # 如果这里返回httpresponse对象,会将返回给用户浏览器的内容替换成你自己的
 
class Mymd2(MiddlewareMixin):
    def process_request(self, request):
        print('这里的代码会在视图函数之前执行')
 
    def process_response(self, request, response):
        print('pass')
        return response  # 这里的response必须要返回
 
    def process_view(self, request, view_func, *args, **kwargs):
        print(view_func, aegs, kwargs)
 
    def process_template_response(self, request, response):
        return response
 
    def process_exception(self, request, exception):
        print(exception)  # 错误信息

之后需要在settings.py中注册我们的中间件:

# settings.py
 
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',
    'mymiddleware.mymddle.Mymd1',
    'mymiddleware.mymddle.Mymd2',
]

中间件是在特定的点触发,信号量可以在许多个地方触发。

posted @ 2020-02-07 19:57  开花的马铃薯  阅读(107)  评论(0编辑  收藏  举报