Django 中如何使用中间键和上下文处理器
Django 中的中间件和上下文处理器可以帮助我们在处理 HTTP 请求和响应时进行一些额外的操作,如修改请求数据、添加响应头部、对视图函数进行拦截和修改等等。在本篇文章中,我们将深入探讨 Django 中如何使用中间件和上下文处理器。
一、中间件
1. 中间件的作用
中间件是 Django 中的一种钩子机制,它可以在 Django 处理请求和响应的过程中,对输入的请求和输出的响应进行修改和增强。中间件的作用包括但不限于:
- 修改请求数据,如添加请求头部、更改请求方法等;
- 拦截请求或响应,进行身份验证或其他处理;
- 缓存请求和响应结果,提高性能;
- 处理异常,如捕获 404 错误等;
- 记录日志;
- 对视图函数进行拦截和修改,如添加装饰器等。
2. 中间件的实现
中间件的实现分为两个步骤:定义中间件类和添加中间件到中间件列表。
(1) 定义中间件类
中间件类需要实现下列方法:
- __init__(self, get_response):构造方法,get_response 是一个请求处理函数,必须在中间件类中保存为 self.get_response;
- __call__(self, request):调用方法,返回一个响应;
- process_request(self, request):处理请求,可返回 None 或 HttpResponse 对象,None 表示将请求传递到下一个中间件或视图函数;
- process_response(self, request, response):处理响应,必须返回一个 HttpResponse 对象,可以对响应进行修改。
示例代码:
class CustomMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
return self.process_request(request)
def process_request(self, request):
# 对请求进行修改或处理
return self.get_response(request)
def process_response(self, request, response):
# 对响应进行修改或处理
return response
(2) 添加中间件到中间件列表
在 settings.py 文件中,将中间件类添加到 MIDDLEWARE 列表中,按顺序执行,从上到下依次执行。
示例代码:
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',
'myapp.middleware.CustomMiddleware',
]
3. 中间件的应用
下面以缓存中间件为例,介绍中间件的应用。
(1) 缓存中间件的实现
缓存中间件可将响应结果存储到缓存中,从而减少后续请求的处理时间。缓存中间件的实现示例:
from django.core.cache import cache
class CacheMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
cached_response = cache.get(request.get_full_path())
if cached_response:
return cached_response
response = self.process_request(request)
cache.set(request.get_full_path(), response)
return response
def process_request(self, request):
return self.get_response(request)
(2) 添加中间件到中间件列表
将中间件类添加到 MIDDLEWARE 列表中。
MIDDLEWARE = [
...
'myapp.middleware.CacheMiddleware',
]
(3) 配置缓存
在 settings.py 文件中,配置缓存:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
4. 中间件的执行顺序
中间件的执行顺序由 MIDDLEWARE 列表中的顺序决定,从上到下依次执行,中间件的执行可以分为两个阶段:
- 请求阶段:按照顺序从上到下调用各个中间件的 process_request() 方法,如果有中间件返回 HttpResponse 对象,则直接跳过后续的中间件并返回该响应,否则继续调用下一个中间件的 process_request() 方法,直到中间件列表的末尾;
- 响应阶段:从下到上依次调用各个中间件的 process_response() 方法,中间件可以对响应对象进行修改,最终返回一份响应。
二、上下文处理器
1. 上下文处理器的作用
上下文处理器可将一些变量添加到模板上下文中,便于在模板中使用。在 Django 中,上下文处理器可以为所有模板提供一些通用的数据,如网站标题、访问统计等。
2. 上下文处理器的实现
上下文处理器是一个函数,接收一个 HttpRequest 对象作为参数,返回值为一个字典,包含需要添加到模板上下文中的变量键值对。
示例代码:
def custom_context_processor(request):
context = {
'site_title': 'MySite',
'site_url': 'http://www.mysite.com',
'visit_count': cache.get('visit_count') or 0,
}
return context
3. 添加上下文处理器
将上下文处理器添加到 settings.py 文件中的 TEMPLATES 配置中的 OPTIONS 字典的 context_processors 列表中。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'myapp.context_processors.custom_context_processor',
],
},
},
]
4. 模板中使用上下文变量
在模板中使用上下文变量,只需要在模板中使用 {{ }} 语法,并填写上下文变量的名字即可。示例代码:
<!DOCTYPE html>
<html>
<head>
<title>{{ site_title }}</title>
</head>
<body>
<p>访问次数:{{ visit_count }}</p>
<a href="{{ site_url }}">请访问官网</a>
</body>
</html>
5. 上下文处理器的应用
下面以访问统计的应用为例,介绍上下文处理器的应用。
(1) 访问统计的实现
访问统计可使用缓存中间件来实现,将缓存的访问次数添加到上下文变量中。
def visit_count_processor(request):
visit_count = cache.get('visit_count') or 0
visit_count += 1
cache.set('visit_count', visit_count)
context = {
'visit_count': visit_count,
}
return context
(2) 添加上下文处理器
将上下文处理器添加到 settings.py 文件中的 TEMPLATES 配置中的 OPTIONS 字典的 context_processors 列表中。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
...
'myapp.context_processors.visit_count_processor',
],
},
},
]
(3) 模板中使用上下文变量
在模板中使用 {{ visit_count }} 语法来显示访问次数。
