zoukankan      html  css  js  c++  java
  • Django--进阶--中间件的使用

    - 中间件是什么?

    中间件是一个钩子框架,它们可以介入Django 的请求和响应处理过程。它是一个轻量级、底层的“插件”系统,用于在全局修改Django 的输入或输出。

    每个中间件组件负责完成某个特定的功能。例如,Django 包含的一个中间件组件AuthenticationMiddleware ,它使用会话将用户和请求关联起来。

    这篇文档讲解中间件如何工作、如何激活中间件以及如何编写你自己的中间件。

    注册中间件

    要激活一个中间件组件,需要把它添加到Django 配置文件中的MIDDLEWARE元组中。

    在MIDDLEWARE中,每一个中间件组件用字符串的方式描述:一个完整的Python全路径加上中间件的类名称。

    例如,使用 django-admin创建工程的时候生成的默认值:

    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',
    ]

    Django程序中,中间件并不是必须的,你要你喜欢,MIDDLEWARE 可以为空,但是强烈推荐至少使用CommonMiddleware

    MIDDLEWARE 中的顺序非常重要,因为一个中间件可能依赖于另外一个,例如

    AuthenticationMiddleware依赖于SessionMiddleware,因为AuthenticationMiddleware通过session中存储认证通过的用户。

    钩子和应用的顺序

    在请求阶段中,调用视图前,django会按照MIDDLEWARE 中定义的顺序向下执行中间件,会用到连个钩子:

    1. process_request()
    2. process_view()

    在响应阶段,调用视图函数之后,中间件会按照相反的顺序应用,自底向上。会用到三个钩子:

    1. process_exception() (仅当视图抛出异常的时候)
    2. process_template_respose()(仅用于模板响应)
    3. process_response()

    钩子函数执行流程图

    自定义中间件

    每个中间件组件是一个独立的Python 类,你可以定义下面这些方法中的一个或多个:

    process_request

    process_request(request)

    在Django决定执行一个视图之前,process_request()会在每个请求上调用。

    它应该返回一个None 或一个HttpResponse对象。

    如果返回None,Django会继续处理这个请求,执行其它process_request()中间件,然后process_view()中间件,最后是对应的视图。

    如果它返回一个HttpResponse对象,Django 就不用再去调用其它的request、view 或exception 中间件,或对应的视图;它将对HttpResponse运用响应阶段的中间件,并返回结果。

    process_response

    process_response(request, response)

    request是一个HttpRequest对象。response是Django视图或者中间件返回的HttpResponse或者StreamingHttpResponse对象。

    process_response()在所有响应返回浏览器之前被调用。

    这个方法必须返回HttpResponse或者StreamingHttpResponse对象。它可以改变已有的response,或者创建并返回新的HttpResponseStreamingHttpResponse对象。

    不像 process_request()process_view()方法,即使同一个中间件类中的process_request()process_view()方法会因为前面的一个中间件返回HttpResponse而被跳过,process_response()方法总是会被调用。特别是,这意味着你的process_response()方法不能依赖于process_request()方法中的设置。

    最后,记住在响应阶段中,中间件以相反的顺序被应用,自底向上。意思是定义在MIDDLEWARE最底下的类会最先被运行。

    中间件定义准则

    • 中间件的类不能是任何类的子类。
    • 中间件可以存在于你Python 路径中的任何位置。 Django所关心的只是被包含在MIDDLEWARE中的配置。

    示例代码

    # encoding:utf-8
    # Author:"richie"
    # Date:11/6/2017
    from django.conf import settings
    from django.shortcuts import redirect
    
    
    class MiddlewareMixin(object):
        """
        这是一个基类,为了更好的解耦,我们直接本地化这个类,而不继承django中定义的
        """
        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
    
    
    class AuthMiddleware(MiddlewareMixin):
        """
        用户登录验证中间件
        """
        def process_request(self, request):
            # 遇到登录path和注册path不进行登录验证,直接返回None
            if request.path_info == '/user/login/' or 
                            request.path_info == '/user/register/':
                return None
            # 获取session信息,如果session中没有登录后的传递的字段,就跳转到登录页面
            if not request.session.get(settings.SESSION_KEY):
                return redirect('/user/login/')
  • 相关阅读:
    delphi安装pngimage控件,不需要安装,只需引用就行
    怎样把PL/SQLDeveloper字体调大
    resource is out of sync with the file
    SecureCRT:[1]SecureCRT配色方案
    安装开发环境注意事项2
    插入排序
    tomcat更改端口序
    tomcat更改端口
    maven添加jar包
    java总结
  • 原文地址:https://www.cnblogs.com/richiewlq/p/7800751.html
Copyright © 2011-2022 走看看