当前位置:   article > 正文

快速上手Django(五) -Django之中间件MIDDLEWARE(SessionMiddleware)

sessionmiddleware

快速上手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到达视图函数前,中间件先对request.user是否验证通过进行判断,然后再进行跳转。
  • 在View视图函数执行前记录用户的IP地址
  • 某些IP访问服务器的频率过高,进行拦截,比如限制每分钟不能超过n次。
  • 在View视图函数执行前传递额外的变量或参数
  • 在View视图函数执行前或执行后把特定信息打印到log日志
  • 在View视图函数执行后对reponse数据进行修改后返回给用户
  • Django对POST表单中携带的CSRF token的全局校验也是通过CsrfViewMiddleware这个中间件进行的

三、Django默认的中间件

当你创建一个新django项目时,你会发现settings.py里已经注册了一些Django自带的中间件,每个中间件都负责一个特定的功能。

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware', # 处理是否带斜杠的
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • SecurityMiddleware:为request/response提供了几种安全改进
  • SessionMiddleware:开启session会话支持,无它无session。要应用session,必须开启session中间层
    默认情况下,session数据是存储到数据库中的。我们如何得知呢?可以从Django的默认配置中查看到,Django的默认配置路径是from django.conf 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属性,表示当前登录的用户,无它用不了request.user
  • MessageMiddleware:开启基于Cookie和会话的消息支持,无它无message
  • XFrameOptionsMiddleware:对点击劫持的保护

注意:从Django 1.10起, settings.py里注册中间件使用MIDDLEWARE=,而不是MIDDLEWARE_CLASSES= 。

class MyMiddleware(MiddlewareMixin): 和 class SimpleMiddleware(object): 区别

在 Django 中,这两种中间件类有以下区别:
class MyMiddleware(MiddlewareMixin):

  • 这种中间件类继承自 MiddlewareMixin ,需要实现 process_request , process_response ,process_view , process_exception 四个方法中的一个或多个。
  • MiddlewareMixin 类已经实现了 initcall 方法,所以我们只需要重写需要的方法即可。
  • 这是 Django 推荐的中间件写法。
    例如:
    python
    from django.utils.deprecation 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 这六个方法。
  • 我们需要自己实现 initcall 方法来调用 process_request 等方法。
  • 这种写法较老,Django 现推荐使用 MiddlewareMixin 。

例如:

class SimpleMiddleware(object):
    def 
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/378923
推荐阅读
相关标签
  

闽ICP备14008679号