django学习——实例说明middleware中间件的用法

标签: django middleware 中间件
20人阅读 评论(0) 收藏 举报
分类:

关于django的中间件,网上有很多详细的解释,这里我们就不在赘述了。直接给几个链接:

https://blog.csdn.net/alvine008/article/details/50249777
https://www.cnblogs.com/jasonwang-2016/p/5910479.html

我这里以实际工作中的某个例子来举例说明它的用法。

实例一:

在用django做接口时,如果返回的数据是json格式,我们一般通过JsonResponse返回。写法入下:

def test(request):
    ...
    return JsonResponse({"code": 0, "msg": data})

当接口多的时候,每次都这么写会很麻烦,如果我们想要直接返回{"code": 0, "msg": data},该怎么做呢,这个时候就可以通过中间件来对返回的response进行处理:

from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponse, JsonResponse


class ExtraMiddleware(MiddlewareMixin):
    def process_response(self, request, response):
        if isinstance(response, str):
            response = HttpResponse(response)
        if isinstance(response, (dict, list)):
            response = JsonResponse(response)
        return response

然后将其添加到setting.py中即可:

MIDDLEWARE = [
    ...
    'test.app.ExtraMiddleware'
]

中间件的位置可以放在项目中的任何位置,在setting.py中正确指定即可。

这个中间件,我们将返回的response进行处理,如果是str格式的,我们就用HttpResponse对其进行封装;如果是dict, list格式的,就用JsonResponse进行封装,这样我们就可以直接返回原始数据了。

def test(request):
    ...
    return {"code": 0, "msg": data}

实例二:

有时我们需要统计整个网站的访问量,如果是某一个网页的访问量,我们可以直接在该网页的视图函数中写入相关代码,每访问一次,可以将数据库中的相关数值加1就可以了。但是如果我们想要统计整个网站的访问量,包括该网站的各个网页,这时,我们就可以利用中间件middleware的process_request功能函数了。因为每一次对网站的request,都需要经过中间件的process_request。我们在这里对其做统计就可以了。

from django.utils.deprecation import MiddlewareMixin
from blog.models import Counts

class CountMiddleware(MiddlewareMixin):
    def process_request(self, request):
        # 每一次访问,访问数加一
        count_nums = Counts.objects.get(id=1)
        count_nums.visit_nums += 1
        count_nums.save()

然后将该中间件加入到setting.py中即可:

MIDDLEWARE = [
    ...
    'myblog.middleware.CountMiddleware',

这样既可以统计整个网站的访问量了。

但是还有一个问题,这种方法会统计每次访问页面的次数,不会关联ip地址,怎么将ip与访问次数关联上呢?

实例三:

再比如,我们在网站放到服务器上正式运行后,DEBUG改为了 False,这样更安全,但是有时候发生错误我们不能看到错误详情,调试不方便,有没有办法处理好这两个事情呢?

  1. 普通访问者看到的是友好的报错信息

  2. 管理员看到的是错误详情,以便于修复 BUG

当然可以有,利用中间件就可以做到!代码如下:

import sys
from django.views.debug import technical_500_response
from django.conf import settings

class UserBasedExceptionMiddleware(object):
    def process_exception(self, request, exception):
        if request.user.is_superuser or request.META.get('REMOTE_ADDR') in settings.ALLOWED_HOSTS:
            return technical_500_response(request, *sys.exc_info())

把这个中间件像上面一样,加到你的 settings.py 中的 MIDDLEWARE_CLASSES 中,可以放到最后,这样可以看到其它中间件的 process_request的错误。

当访问者为管理员时,就给出错误详情。

普通人看到的是普通的 404。

总结来说的话:中间件可以对客户端的请求做预处理,并对服务器的响应做适当的处理。使我们可以根据需要来进行定制管理的。

查看评论

Django框架全面讲解 -- 中间件(MiddleWare)

django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。在django项目的set...
  • shentong1
  • shentong1
  • 2017-12-18 09:01:05
  • 654

Django教程笔记:六、中间件middleware

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

深入学习Django源码基础13 - Django中的中间件(middleware)

运行启动,定位到http的处理文件 在core/handler.py中 def load_middleware(self): 。。。。。。 request_m...
  • watsy
  • watsy
  • 2013-09-10 18:05:01
  • 2228

Django-中间件Middleware

Django-中间件 Djano中间件流程 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行...
  • maidou931019
  • maidou931019
  • 2017-07-03 20:11:20
  • 1463

Django middleware 中间件

1. 概念中间件是一个钩子框架,它们可以过滤发送到Django视图层的请求,也可以过滤视图层发送给前端的响应. 它是一个轻量级的底层插件系统,用途在全局修改Django的输入或者输出 每个中间件负...
  • u013205877
  • u013205877
  • 2017-08-22 15:02:44
  • 480

Django Middleware的几个关键方法

Django 处理一个 Request 的过程是首先通过中间件,然后再通过默认的 URL 方式进行的。我们可以在 Middleware 这个地方把所有Request 拦截住,用我们自己的方式完成处...
  • mbl114
  • mbl114
  • 2017-10-12 22:20:08
  • 151

[Django高级]理解django中的中间件机制和执行顺序

原文来自 Understanding Django Middlewares, 这篇文章从整体上介绍了django中中间件定义,作用,和怎么样自己写中间件 –orangleliu。 注:middlew...
  • lzz957748332
  • lzz957748332
  • 2015-09-09 15:40:54
  • 6460

django 如何编写控制登录和访问权限控制的中间件

django中,很多时候我们都需要有一个地方来进行更加详细的权限控制,例如说哪些用户可以访问哪些页面,检查登录状态等,这里的话就涉及到了中间件的编写了。 在django项目下的setting.py文...
  • u011085172
  • u011085172
  • 2018-01-12 15:15:12
  • 389

[Django架构流程分析]了解Django Middleware的几个关键方法

注:以下内容转载自 现代魔法学院 网站的 了解Django Middleware的几个关键方法 一文,仅供学习使用。         Django 处理一个 Request 的过程是首先通过中间件...
  • dapeng0802
  • dapeng0802
  • 2015-11-11 23:19:02
  • 467

Laravel5.3使用学习笔记---中间件

Laravel提供了中间件的使用。那什么是中间件呢,根据用法,我总结为,夹在“请求—>控制器—>响应—>end”中间运行的代码片段。本文将以官方英文文本为基础资料进行笔记记录。 Laravel V5...
  • Gavin_new
  • Gavin_new
  • 2016-12-06 19:57:58
  • 2547
    个人资料
    持之以恒
    等级:
    访问量: 4万+
    积分: 1949
    排名: 2万+
    最新评论