欢迎访问宙启技术站
智能推送

django之中间件的配置使用

发布时间:2023-05-16 09:24:05

Django中间件(Middleware)是一组插件,它们可以在请求(Request)到达视图函数之前或响应(Response)返回浏览器之前拦截、操作以及修改请求和响应的过程。

Django的中间件系统是基于类实现的,它包括一些内置的中间件,可以让开发者直接在settings.py中进行配置,也可以自定义中间件。

内置中间件

Django内置了许多中间件,比如跨站请求伪造防护(CsrfViewMiddleware)、GZip压缩(GZipMiddleware)等,可以在settings.py中进行配置。

例如,要启用跨站请求伪造防护中间件,只需要在MIDDLEWARES设置中添加:

MIDDLEWARES = [
    '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.csrf.CsrfViewMiddleware就是跨站请求伪造中间件。注意这个配置是有顺序的,从前往后执行。

自定义中间件

我们可以自定义中间件,只需要实现一个类,包含以下方法中的一个或多个:

* 在请求到达视图函数前处理请求的方法process_request(request),它必须返回None或HttpRequest对象。

* 在视图函数返回响应前将响应对象处理的方法process_response(request, response),它必须返回HttpResponse对象。

* 在视图函数执行过程中出现异常时处理异常的方法process_exception(request, exception),它必须返回HttpResponse对象。

假设我们要实现一个简单的打印请求和响应数据的中间件:

class LogMiddleware:
    def process_request(self, request):
        print(f"request path: {request.path}")
        return None
    
    def process_response(self, request, response):
        print(f"response status code: {response.status_code}")
        return response

要使用这个中间件,需要在settings.py中添加:

MIDDLEWARES = [
    # ...
    'myapp.middleware.LogMiddleware',
]

注意这里的myapp.middleware是指LogMiddleware所在的模块和文件名。如果LogMiddleware定义在一个命名为middleware.py的文件中,那么就要改成myapp.middleware.LogMiddleware。

现在,在每次请求和响应的时候,都会在控制台输出日志信息了。

中间件的执行顺序

中间件的执行顺序可以由MIDDLEWARES设置决定,按照顺序依次执行。Django框架自带的中间件会自动添加到MIDDLEWARES中,不需要手动添加。

对于视图函数的执行,中间件的执行顺序如下:

1. 所有的middleware中的process_request方法按照顺序依次执行,直到返回HttpResponse对象或者None。

2. 如果返回了HttpResponse对象就终止,不会执行process_view,也不会进入视图函数处理。如果返回了None就继续下一个中间件,或者执行process_view。

3. 所有的middleware中的process_view方法按照顺序依次执行,直到返回None或者一个HttpResponse对象。

4. 如果返回了HttpResponse对象就直接返回,不会执行视图函数处理,也不会执行process_template_response。

5. 如果返回了None就继续下一个中间件,或者执行视图函数处理。

6. 视图函数处理完成后,所有的middleware中的process_response方法按照顺序依次执行,直到返回HttpResponse对象为止。

7. Response返回完毕后,所有的middleware中的process_template_response方法按照顺序依次执行,直到返回HttpResponse对象为止。

中间件的使用场景

中间件是一个非常实用的工具,可以用于实现各种功能。以下是一些中间件常见的使用场景:

1. 跨站请求伪造防护

2. 安全验证

3. 请求参数处理

4. 日志记录

5. 性能监控

6. 响应数据处理

7. 缓存处理

8. 异常处理

总结

中间件是Django框架中一个非常重要的组件,可以拦截、处理、修改请求和响应的过程,实现各种有用的功能。Django框架内置了一些中间件,比如跨站请求伪造防护、GZip压缩等,可以通过MIDDLEWARES设置来配置。同时,我们也可以自定义中间件,只需要实现相应的方法即可。在使用中间件时,需要注意中间件的执行顺序。