Django的上下文处理器
模板要在上下文中渲染。
上下文是django.template.Context的实例。django.template.RequestContext是Django提供的一个子类。
django.template.RequestContext默认为模板上下文添加很多变量。使用render()快捷方式时,如果没有明确传入其他上下文,默认使用RequesetContext。
django.template.Context的实例
from django.template import loader, Context
def index(request):
......
t = loader.get_template("index.html") # 手动加载模板
c = Context(
'app':'app01',
'user':request.user,
'id_addr':request.META['REMOTE_ADDR']
'message':'index view'
) # 构建上下文对象
return t.render(c) # 渲染模板
def home(request):
......
t = loader.get_template("home.html") # 手动加载模板
c = Context(
'app':'app01',
'user':request.user,
'id_addr':request.META['REMOTE_ADDR']
'message':'home view'
) # 构建上下文对象
return t.render(c) # 渲染模板
django.template.RequestContext和上下文处理器就是为了处理变量重复的问题而出现的。上下文处理器用于指定自动在各个上下文中设定的变量。这样就不需要调用render()时都指定。
django.template.RequestContext的处理办法
使用上下文处理器的做法是创建处理器,将处理器传给RequestContext。
from django.template import loader, RequestContext
def custom_proc(request):
# 上下文处理器
return {
"app01":"app01",
"user":request.user,
"id_addr":request.META['REMOTE_ADDR']
}
def index(request):
......
t = loader.get_template("index.html") # 手动加载模板
c = RequestContext(
request,
{'message':'index view'},
processors=[custom_proc])
return t.render(c)
def index(request):
......
t = loader.get_template("home.html") # 手动加载模板
c = RequestContext(
request,
{'message':'home view'},
processors=[custom_proc])
return t.render(c)
这是没有使用render()快捷方式,这样避免了在模板中自己手动调用loader.get_template(),创建上下文处理器。
还有个方法context_instance参数将进一步缩减代码。
使用context_instance参数
from django.shortcuts import render
from django.template import loader, RequestContext
def custom_proc(request):
# 上下文处理器
return {
"app01":"app01",
"user":request.user,
"id_addr":request.META['REMOTE_ADDR']
}
def index(request):
......
return render(
request,
{'message':'index view'},
context_instance=RequestContext(
request,processors=[custom_proc]
)
)
def index(request):
......
return render(
request,
{'message':'home view'},
context_instance=RequestContext(
request,processors=[custom_proc]
)
)
全局上下文处理器
context_processors设置(在settings.py文件中)指明始终提供给RequestContext的上下文处理器。
context_processors的默认值如下:
'context_processors':[
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
这是个可调用的列表,接口与前文定义的custom_proc函数一样——参数是一个请求对象,返回值是一个字典。
注意:
context_processors中的值是字符串,因此处理器要在Python路径中。