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

关于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。

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

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页