Django进阶–上下文处理器
1. 简介
上下文处理器(context processor),用于从视图函数向模板传递参数、亦或者可以理解为给模板添加属性(字段),简言之用于后端向前端返回数据。
2. 系统上下文处理器
#
TEMPLATES = [
{
'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',
],
},
},
]
2.1 debug
返回debug所需上下文变量,用于调试。
2.2 request
返回一个字典,源码如下:
def request(request):
return {'request': request}
#简言之,增加一个request变量
2.3 auth
返回使用Django身份验证系统的应用所需的上下文变量。如果请求中没有“user”属性,请使用AnonymousUser(来自
django.contrib.auth)。简言之,返回一个"user"对象。
2.4 messages
返回一个惰性’message’变量
def messages(request):
return {
'messages': get_messages(request),
'DEFAULT_MESSAGE_LEVELS': DEFAULT_LEVELS,
}
3. 自定义上下文处理器
回想日常开发,当模板需要一个动态变量时,往往通过路由表从对应的视图函数获取(HttpResponse对象的context参数)。如果想在各个页面调用相同变量,依上述方法就需要在每个视图函数都声明该变量,造成不必要的开销,违反了软件开发准则。
这时候我们可以通过自定义上下文来达到这个目的;例如,我们需要在每个页面显示当前用户IP地址
3.1 创建模块
在app下创建上下文模块customer_context_processor.py
-project
-project
-app
-templatetags
-forms.py
-middleware.py
-models.py
-customer_context_processor.py #命名开心就好
3.2 编写代码
#customer_context_processor.py
def user_ip_show(request): # 必须接受request参数
ip = request.Meta['REMOTE_ADDR']
context = {
'showIp': 'IP地址:%s' % ip
}
return context # 必须返回字典
3.3 注册
注册到settings.py->TEMPLATES->OPTIONS->context_processors
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'book.customer_context_processor.user_ip_show', #settings路径中从BASE_DIR往下,book是app名称
],
3.4 注册
<!--任意前端页面-->
{{ showIp }}
3.5 展示
欢迎回家:qwe
安全退出 IP地址:171.211.46.139