博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django中间件学习笔记
阅读量:7026 次
发布时间:2019-06-28

本文共 3001 字,大约阅读时间需要 10 分钟。

hot3.png

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

每个中间件都会负责一个功能,例如,AuthenticationMiddleware,与sessions处理相关。

那什么是Middleware呢?文档上说是中间件,可能不好理解,那么其实就是Javaweb框架中Struts2中的拦截器,无论是作用还是原理都是如出一辙的

我们从浏览器发出一个请求 Request,得到一个响应后的内容 HttpResponse ,这个请求传递到 Django的过程如下:

也就是说,每一个请求都是先通过中间件中的 process_request 函数,这个函数返回 None 或者 HttpResponse 对象,如果返回前者,继续处理其它中间件,如果返回一个 HttpResponse,就处理中止,返回到网页上。

中间件不用继承自任何类(可以继承 object ),下面一个中间件大概的样子:

class CommonMiddleware(object):    def process_request(self, request):        return None     def process_response(self, request, response):        return response

1.如果我们要做一个 拦截器,发现有恶意访问网站的人,就拦截他!

假如我们通过一种技术,比如统计一分钟访问页面数,太多就把他的 IP 加入到黑名单 BLOCKED_IPS(这部分没有提供代码,主要讲中间件部分)

class ForbidIpMiddleware(object):    def process_request(self, request):        if request.META['REMOTE_ADDR'] in getattr(settings, "BLOCKED_IPS", []):            return http.HttpResponseForbidden('

Forbidden

')

这里的代码的功能就是 获取当前访问者的 IP (request.META['REMOTE_ADDR']),如果这个 IP 在黑名单中就拦截,如果不在就返回 None (函数中没有返回值其实就是默认为 None),把这个中间件的 Python 路径写到settings.py中

MIDDLEWARE = (    'example.middleware.ForbidIpMiddleware',    ...其它的中间件)

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

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

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

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

import sysfrom django.views.debug import technical_500_responsefrom 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.INTERNAL_IPS:            return technical_500_response(request, *sys.exc_info())

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

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

3.Django 1.10 接口发生变化,变得更加简洁

class SimpleMiddleware(object):    def __init__(self, get_response):        self.get_response = get_response     def __call__(self, request):        # 调用 view 之前的代码         response = self.get_response(request)        # 调用 view 之后的代码         return response

Django 1.10.x 也可以用函数来实现中间件,详见。

新版本需要继承MiddlewareMixin

class SimpleMiddleware(MiddlewareMixin):    def process_request(self, request):        pass     def process_response(request, response):        pass

新版本中 django.utils.deprecation.MiddlewareMixin 的  如下:

class MiddlewareMixin(object):    def __init__(self, get_response=None):        self.get_response = get_response        super(MiddlewareMixin, self).__init__()     def __call__(self, request):        response = None        if hasattr(self, 'process_request'):            response = self.process_request(request)        if not response:            response = self.get_response(request)        if hasattr(self, 'process_response'):            response = self.process_response(request, response)        return response

__call__ 方法会先调用 self.process_request(request),接着执行 self.get_response(request) 然后调用 self.process_response(request, response)

转载于:https://my.oschina.net/liuyuantao/blog/1096459

你可能感兴趣的文章
java中 Excel表实现数据导入导出
查看>>
PHP str_replace() 和str_ireplace()函数
查看>>
什么是全栈工程师
查看>>
Html5新特性
查看>>
DataGrdid 利用结果集反向转换成数据List
查看>>
linux下简易端口扫描器
查看>>
HDU 1205
查看>>
每日英文2013.07.01
查看>>
Openstack-L 路由注入方式
查看>>
Linux安全之密钥登录
查看>>
nginx重写链接
查看>>
node的fs模块
查看>>
wordpress和传统网站的加载性能优化
查看>>
wordpress主机选择并不难,符合这五条的都是好主机!
查看>>
javaweb中的三个域
查看>>
double free or corruption (!prev): 0x080644c8 ***
查看>>
集训第五周动态规划 H题 回文串统计
查看>>
约瑟夫问题
查看>>
CM android的CMUpdater分析(一)
查看>>
2017python学习的第八天,socket的使用
查看>>