文章目录
- 快速上手Django(五) -Django之中间件MIDDLEWARE(SessionMiddleware)
-
- 一、什么是Django中间件MIDDLEWARE
- 二、中间件的应用场景
- 三、Django默认的中间件
-
- class MyMiddleware(MiddlewareMixin): 和 class SimpleMiddleware(object): 区别
- 四、Django的中间件执行顺序
- 五、自定义中间件
- 六、Session会话中间件-SessionMiddleware
-
- 启用或禁用 Session
- Session middleware的原理
- session数据是存储位置
- Views 中应用 Session
- 工作常见问题
-
- 访问某个url,报错:: relation "django_session" does not exist
- 七、AuthenticationMiddleware中间件
- 八、django MessageMiddleware中间件
快速上手Django(五) -Django之中间件MIDDLEWARE(SessionMiddleware)
一、什么是Django中间件MIDDLEWARE
Django官方文档中对于Middleware的介绍:
中间件(Middleware)是一个镶嵌到django的request/response处理机制中的一个钩子(hooks) 框架。它是一个可以修改django全局输入或输出的一个底层插件系统。
如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。
中间件(Middleware)在整个Django的request/response处理机制中的角色如下所示:
HttpRequest -> Middleware -> View -> Middleware -> HttpResponse
总结:中间件允许您在一个浏览器的请求在到达Django视图之前处理它,以及在视图返回的响应到达浏览器之前处理这个响应。
二、中间件的应用场景
我们可以编写自己的中间件实现权限校验,限制用户请求、打印日志、改变输出内容等多种应用场景,比如:
- 禁止特定IP地址的用户或未登录的用户访问我们的View视图函数
(1)如果用户访问的是login视图(放过)
(2)如果访问其他视图,需要检测是不是有session认证,已经有了放行,没有返回login,这样就省得在多个视图函数上写装饰器了!
一个request到达视图函数前,中间件先对是否验证通过进行判断,然后再进行跳转。 - 在View视图函数执行前记录用户的IP地址
- 某些IP访问服务器的频率过高,进行拦截,比如限制每分钟不能超过n次。
- 在View视图函数执行前传递额外的变量或参数
- 在View视图函数执行前或执行后把特定信息打印到log日志
- 在View视图函数执行后对reponse数据进行修改后返回给用户
- Django对POST表单中携带的CSRF token的全局校验也是通过CsrfViewMiddleware这个中间件进行的
三、Django默认的中间件
当你创建一个新django项目时,你会发现里已经注册了一些Django自带的中间件,每个中间件都负责一个特定的功能。
MIDDLEWARE = [
'',
'',
'', # 处理是否带斜杠的
'',
'',
'',
'',
]
- SecurityMiddleware:为request/response提供了几种安全改进
- SessionMiddleware:开启session会话支持,无它无session。要应用session,必须开启session中间层
默认情况下,session数据是存储到数据库中的。我们如何得知呢?可以从Django的默认配置中查看到,Django的默认配置路径是from import global_settings,我们可以打开然后查看到默认配置。 - CommonMiddleware:基于APPEND_SLASH和PREPEND_WWW的设置来重写URL,如果APPEND_SLASH设为True,并且初始URL 没有以斜线结尾以及在URLconf 中没找到对应定义,这时形成一个斜线结尾的新URL;如果PREPEND_WWW设为True,前面缺少 www.的url将会被重定向到相同但是以一个www.开头的url。
- CsrfViewMiddleware:添加跨站点请求伪造的保护,通过向POST表单添加一个隐藏的表单字段,并检查请求中是否有正确的值,无它无csrf保护
- AuthenticationMiddleware:在视图函数执行前向每个接收到的user对象添加HttpRequest属性,表示当前登录的用户,无它用不了
- MessageMiddleware:开启基于Cookie和会话的消息支持,无它无message
- XFrameOptionsMiddleware:对点击劫持的保护
注意:从Django 1.10起, 里注册中间件使用MIDDLEWARE=,而不是MIDDLEWARE_CLASSES= 。
class MyMiddleware(MiddlewareMixin): 和 class SimpleMiddleware(object): 区别
在 Django 中,这两种中间件类有以下区别:
class MyMiddleware(MiddlewareMixin):
- 这种中间件类继承自 MiddlewareMixin ,需要实现 process_request , process_response ,process_view , process_exception 四个方法中的一个或多个。
- MiddlewareMixin 类已经实现了 init 和 call 方法,所以我们只需要重写需要的方法即可。
- 这是 Django 推荐的中间件写法。
例如:
python
from import MiddlewareMixin
class MyMiddleware(MiddlewareMixin):
def process_request(self, request):
print(‘Process request’)
class SimpleMiddleware(object):
- 这种中间件类继承自 object ,需要实现 init , call , process_request , process_response ,process_view , process_exception 这六个方法。
- 我们需要自己实现 init 和 call 方法来调用 process_request 等方法。
- 这种写法较老,Django 现推荐使用 MiddlewareMixin 。
例如:
class SimpleMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
# 一次性配置和初始化。
def __call__(self, request):
# Code to be executed for each request before
# the view (and later middleware) are called.
# 这里写的代码会在视图被调用前执行来处理请求
response = self.get_response(request)
# 这里写的代码会在视图调用后执行来处理响应
# Code to be executed for each request/response after
# the view is called.
return response
def process_view(self, request, view_func