自定义中间件

2019-12-10 19:07:46 最后一行代码 阅读:341
1

分类: Django

中间件介绍:

中间件是在request和response处理过程中的一个插件。比如在request到达视图函数之前,我们可以使用中间件来做一些相关的事情,比如可以判断当前这个用户有没有登陆,如果登陆了就绑定一个user对象到request上。也可以在response到达浏览器之前,做一些相关的处理,比如想统一在response上设置一些Cookie信息等。

 

自定义中间件:

中间件有两种方式创建,函数、类。如果该中间件属于某个app的,那么可以在该app下创建一个py文件来写中间件代码。也可以创建一个py包,用来存放所有中间件。

写好的中间件要添加到MIEDDLEWARE最后面,否则不会生效。

 

函数创建中间件:

# /MyDjango/app1/middlewares.py
def simple_middleware(get_response):                  # 函数名可自定义
    print("项目第一次运行执行的代码")
    def middleware(request):                          # 函数名可自定义
        print("客户端请求数据到达视图函数前执行的代码")
        response = get_response(request)              # 该代码会执行视图函数
        print("服务器响应数据到达浏览器前执行的代码")
        return response                               # 必须返回响应
    return middleware                                 # 返回middleware函数对象


# 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',
    # 添加自定义中间件
    "app1.middlewares.simple_middleeware"
]

 

类创建中间件:

# /MyDjango/app1/middlewares.py
class SimpleMiddleware:                             # 类名可自定义
    def __init__(self, get_response):               # 参数get_response必须有
        print("项目第一次运行执行的代码")
        self.get_response = get_response            # 保存get_response对象,方便以后调用
    def __call__(self, request):                    # 参数request必须有
        print("客户端请求数据到达视图函数前执行的代码")
        response = self.get_response(request)       # 该代码会执行视图函数
        print("服务器响应数据到达浏览器前执行的代码")
        return response                             # 必须返回响应


# 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',
    # 添加自定义中间件
    "app1.middlewares.SimpleMiddleware"
]

 

执行顺序:

"项目第一次运行执行的代码" ==> "客户端请求数据到达视图函数前执行的代码" ==> "服务器响应数据到达浏览器前执行的代码"

 

如果还是看不懂,可以Copy代码到自己项目上测试,看看控制台打印内容就明白了。

回复:

快来抢沙发

老板赏瓶水呗
微信 微信 支付宝 支付宝