Django 中间件
2016-02-26 17:04
453 查看
转自:http://www.ziqiangxuetang.com/django/django-middleware.html
Middleware也就是所谓的中间件 Django的中间件的这个中间指的是 服务器接受到Request ---- View处理,以及View处理完 ---- 发送Response到客户端 这两个中间。
process_request # 接受request之后确定所执行的view之前
process_view # 确定了所要执行的view之后 view真正执行之前
process_response # view 执行之后
process_exception(self, request, exception) # view抛出异常
如果你需要添加自己的中间件,你需要在这个地方进行指定。
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-mobi 或 django-mobile
参考文档:https://docs.djangoproject.com/en/1.8/topics/http/middleware/
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 ),下面一个中间件大概的样子:
一,比如我们要做一个 拦截器,发生有恶意访问网站的人,就拦截他!
假如我们通过一种技术,比如统计一分钟访问页面数,太多就把他的 IP 加入到黑名单 BLOCKED_IPS(这部分没有提供代码,主要讲中间件部分)
二,再比如,我们在网站放到服务器上正式运行后,DEBUG改为了 False,这样更安全,但是有时候发生错误不能显示错误详情页面,有没有办法处理好这两个事情呢?
普通访问者看到的是友好的报错信息
管理员看到的是错误详情,以便于修复 BUG
当然可以有,利用中间件就可以做到!代码如下:
当访问者为管理员时,就给出错误详情,比如访问本站的不存在的页面:http://www.ziqiangxuetang.com/admin/
普通人看到的是普通的 404(自己点开看看),而我可以看到:
三,分享一个简单的识别手机的中间件,更详细的可以参考这个:django-mobi 或 django-mobile
相关文章推荐
- GPS地图坐标转换为其它系列坐标
- 一套关于 Django 的笔试题
- [Mongo] error inserting documents: BSONObj size is invalid (mongoimport mongorestore 数据备份恢复)
- CodeForces 616 D. Longest k-Good Segment(尺取)
- django使用rest_framework
- django book的第一个例子
- Altium Designer AD6 AD9 DXP 制作公司LOGO终极大招,大小随意放置
- golang strconv
- 【转载】Google Analytics 使用图文全攻略
- gomobile 真机 log 打出的日志跟踪
- 原创翻译:James Whittaker系列——Google是如何测试的(3)
- 用goto语句 百钱百鸡。公鸡5元一只,母鸡3元一只,小鸡1元3只。求100元分别能买多少公鸡、母鸡、小鸡。
- golang实现抽象工厂模式
- Django开发常用的模块
- UVA 1623(p256)----Enter the Dragon
- golang实现常用排序算法
- UVa Dragon of Loowater 11292 (贪心)
- 关于python django-admin.py startproject mysite不工作的问题
- ionic 设置logo 与 设置 启动页
- 分布式基础通信协议:paxos,totem和gossip