Django 上下文处理器

时间:2023-03-09 00:20:42
Django 上下文处理器

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路径中。