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

posted @ 2018-09-10 16:13  桥前石头  阅读(1112)  评论(0编辑  收藏  举报