Django框架之七 -->中间件

Django请求流程图

请求和响应穿过了一层层的中间件,中间件是什么

随便点开一个

# django.middleware.common.CommonMiddleware
class CommonMiddleware(MiddlewareMixin):
    response_redirect_class = http.HttpResponsePermanentRedirect
    def process_request(self, request):
        ...
    def should_redirect_with_slash(self, request):
        ...
    def get_full_path_with_slash(self, request):
        ...
    def process_response(self, request, response):
        ...
    def needs_etag(self, response):
        ...

原来中间件就是一个一个的类

process_request方法

request请求穿过中间件时执行的方法,没有返回值(None),设置返回值不为空,request请求不会向后执行,会从本层的porcess_response往回返回response

process_response方法

response响应穿过中间件时执行的方法,他返回respoonse对象,不返回响应不会向后执行

使用上面两个方法就能够自定义一个中间件

中间件登录验证

# 在随便一个文件里
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse,redirect

class AuthMiddleware(MiddlewareMixin):
    def process_request(self,request):
        # 如果么有返回值;返回None,表示可以继续往下执行
        # 如果有返回值,执行自己的response以及以上的response。

        # 如果请求的路径为登录的路径,return None继续向后执行
        if request.path_info == '/login/':
            return None
        
        # 从session中取值
        user_info = request.session.get('user_info')

        # 没取到跳转到登录页,反之向后执行
        if not user_info:
            return redirect('/login/')


    def process_response(self,request,response):
        return response

 然后把这个类映射到中间件中(中间件的顺序很重要)

MIDDLEWARE = [
                ...
                "xxx.xxx.AuthMiddleware" # 路径
]

另外两个

process_view

流程图

process_view位于路由与视图之间

process_view可以用来调用视图函数:

class Md1(MiddlewareMixin):

    def process_request(self,request):
        print("Md1请求")
        #return HttpResponse("Md1中断")
    def process_response(self,request,response):
        print("Md1返回")
        return response

    def process_view(self, request, callback, callback_args, callback_kwargs):

        # return HttpResponse("hello")
        # callback是将要调用的函数,, callback_args, callback_kwargs是参数
        response=callback(request,*callback_args,**callback_kwargs)
        return response

  注意:process_view如果有返回值,会越过其他的process_view以及视图函数,但是所有的process_response都还会执行

process_exception

箭头代表方向,黄色线代表实际穿过的,灰线只起指示作用.

当views出现错误时中间件中的process_exception就会被执行,return之后会越过其他的process_exception以及视图函数,但是所有的process_response都还会执行:

posted @ 2018-01-29 16:49  瓜田月夜  阅读(142)  评论(0)    收藏  举报