您的位置:首页 > 编程语言 > Go语言

Django 中间件

2016-02-26 17:04 453 查看
转自:http://www.ziqiangxuetang.com/django/django-middleware.html

Middleware也就是所谓的中间件 Django的中间件的这个中间指的是 服务器接受到Request ---- View处理,以及View处理完 ---- 发送Response到客户端 这两个中间。

1.中间件只是实现了某些特定方法的普通对象

所以定义一个中间件很容易,你只需要定义一个普通的python类,然后实现如下四个方法中的某一个或者某几个各个函数执行的时机

process_request # 接受request之后确定所执行的view之前

process_view # 确定了所要执行的view之后 view真正执行之前

process_response # view 执行之后

process_exception(self, request, exception) # view抛出异常

2.安装中间件

通过django-admin生成的项目的setting.py的配置文件中默认有如下设置,

如果你需要添加自己的中间件,你需要在这个地方进行指定。

MIDDLEWARE_CLASSES = (

'django.middleware.common.CommonMiddleware',

'django.contrib.sessions.middleware.SessionMiddleware',

'django.middleware.csrf.CsrfViewMiddleware',

'django.contrib.auth.middleware.AuthenticationMiddleware',

)

这里指定的顺序和实际运行时运行的顺序相关,

在request阶段:process_request,process_view 按照其所在类在配置中的先后顺序进行,

在response阶段:process_response,process_exception 则按照相反的顺序进行。

还有一点就是在整个流程中,每一个process_response都会执行到,

而其余三种,都可能会因为其他的直接retuen response或者不发生异常而不被执行到。
---------------------------------------------------------------------------------------------------------------------------------

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



也就是说,每一个请求都是先通过中间件中的 process_request 函数,这个函数返回 None 或者 HttpResponse 对象,如果返回前者,继续处理其它中间件,如果返回一个 HttpResponse,就处理中止,返回到网页上。
中间件不用继承自任何类(可以继承 object ),下面一个中间件大概的样子:
还有 process_view, process_exception 和 process_template_response 函数。

一,比如我们要做一个 拦截器,发生有恶意访问网站的人,就拦截他!
假如我们通过一种技术,比如统计一分钟访问页面数,太多就把他的 IP 加入到黑名单 BLOCKED_IPS(这部分没有提供代码,主要讲中间件部分)
这里的代码的功能就是 获取当前访问者的 IP (request.META['REMOTE_ADDR']),如果这个 IP 在黑名单中就拦截,如果不在就返回 None (函数中没有返回值其实就是默认为 None),把这个中间件的 Python 路径写到settings.py中
Django 会从 MIDDLEWARE_CLASSES 中按照从上到下的顺序一个个执行中间件中的 process_request 函数,而其中 process_response 函数则是最前面的最后执行。

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

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

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

当然可以有,利用中间件就可以做到!代码如下:
把这个中间件像上面一样,加到你的 settings.py 中的 MIDDLEWARE_CLASSES 中,可以放到最后,这样可以看到其它中间件的 process_request的错误。
当访问者为管理员时,就给出错误详情,比如访问本站的不存在的页面:http://www.ziqiangxuetang.com/admin/
普通人看到的是普通的 404(自己点开看看),而我可以看到:



三,分享一个简单的识别手机的中间件,更详细的可以参考这个:django-mobidjango-mobile
参考文档:https://docs.djangoproject.com/en/1.8/topics/http/middleware/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: