前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >django中间件-12

django中间件-12

作者头像
py3study
发布2020-01-20 11:51:29
3920
发布2020-01-20 11:51:29
举报
文章被收录于专栏:python3python3

目录

在django中,中间件其实就是一个类,他是一个可以介入django的 requestresponse 的钩子框架,在请求响应不同的阶段,执行类中不同的代码,用于在全局修改django的输入输出。

自定义中间件

自定义中间件有两种方式,使用函数定义,和使用类定义。

自定义中间件一般定义在项目目录或者‘应用目录下的 middleware.py 文件下。

函数定义

代码语言:javascript
复制
def simple_middleware(get_response):
    # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。

    def middleware(request):
        # 此处编写的代码会在每个请求处理视图前被调用。

        response = get_response(request)

        # 此处编写的代码会在每个请求处理视图之后被调用。

        return response

    return middleware

示例

代码语言:javascript
复制
def simple_middleware(get_response):
    print("django被初始化")

    def middleware(request):
        print("请求")
        response = get_response(request)
        print("响应")
        return response
    return middleware

访问视图执行结果

代码语言:javascript
复制
django被初始化
[20/Oct/2018 09:44:54] "POST /middleware HTTP/1.1" 200 12
请求
视图函数
响应

类定义

代码语言:javascript
复制
class SimpleMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response
        # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。

    def __call__(self, request):
        # 此处编写的代码会在每个请求处理视图前被调用。

        response = self.get_response(request)
        # 此处编写的代码会在每个请求处理视图之后被调用。

        return response

示例

代码语言:javascript
复制
class SimpleMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response
        print("初始化")

    def __call__(self, request):
        print("请求")

        response = self.get_response(request)
        print("响应")

        return response

访问视图执行结果

代码语言:javascript
复制
django初始化
[20/Oct/2018 10:13:34] "POST /middleware HTTP/1.1" 200 12
请求
视图函数
响应
与旧版本中间件的兼容

在Django 1.10版本之前,中间件设置名为MIDDLEWARE_CLASSES,是长这样的:

代码语言:javascript
复制
class Middleware(MiddlewareMixin):

    def __init__(self, get_response=None):
        # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。
        self.get_response = get_response

    def process_request(self, request):
       # 此处编写的代码会在每个请求处理视图前被调用。

    def process_response(self, request, response):
        # 此处编写的代码会在每个请求处理视图之后被调用。

        return response

示例

代码语言:javascript
复制
class Middleware(MiddlewareMixin):

    def __init__(self, get_response=None):
        print("django初始化")
        self.get_response = get_response

    def process_request(self, request):
        print("请求")

    def process_response(self, request, response):
        print("响应")

        return response

访问视图执行结果

代码语言:javascript
复制
django初始化
[20/Oct/2018 10:13:34] "POST /middleware HTTP/1.1" 200 12
请求
视图函数
响应
  • 参数get_response代表被访问的视图函数

中间件的执行顺序

中间件的执行顺序和注册顺序有关系。在视图函数处理前,会按注册顺序从上往下执行。在属兔函数处理后,会按注册顺序从上往下执行, 在初始化的时候,也是从下往上执行。

示例

定义两个中间件

代码语言:javascript
复制
def simple_middleware(get_response):
    print("django被初始化")

    def middleware(request):
        print("请求")
        response = get_response(request)
        print("响应")
        return response
    return middleware


class SimpleMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response
        print("初始化")

    def __call__(self, request):
        print("请求")

        response = self.get_response(request)
        print("响应")

        return response

注册顺序

代码语言:javascript
复制
MIDDLEWARE = [
    'middleware.middleware.simple_middleware',
    'middleware.middleware.SimpleMiddleware',

执行结果

代码语言:javascript
复制
初始化2
django被初始化1
请求1
请求2
视图函数
响应2
响应1
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 自定义中间件
    • 函数定义
      • 类定义
        • 与旧版本中间件的兼容
    • 中间件的执行顺序
    相关产品与服务
    消息队列 TDMQ
    消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档