django之中间件的配置使用
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设置来配置。同时,我们也可以自定义中间件,只需要实现相应的方法即可。在使用中间件时,需要注意中间件的执行顺序。
