django学习记录-RequestContext

官方文档

RequestContext是Context的子类,跟Context有一些区别

RequestContext强迫第一个参数是request,第二个是一个构造Context对象用的字典,第三个是可选的,是一个自定义的Context Processer(上下文处理器)

RequestContext总是会加载默认的Context Processer


Context Processer是这样的一种处理器,他会接收request作为参数,并且根据request(比如request中的.META)来添加额外的Context字典到RequestContext中,与在RequestContext中原来的字典结构构成新的Context传递给模板

Context Processer在配置settings.py文件的TEMPLATE_CONTEXT_PROCESSORS中,一般默认有下面几个:

("django.contrib.auth.context_processors.auth",

"django.core.context_processors.debug",

"django.core.context_processors.i18n",

"django.core.context_processors.media",

"django.core.context_processors.static",

"django.core.context_processors.tz",

"django.contrib.messages.context_processors.messages")

首先,RequestContext会使用你传入的字典结构构造一个Context,之后,上面的处理器顺序加载,每一个处理完后,传递给下一个处理器(就是添加响应的键值对到context结构中),下一个处理器又再处理,所以小心,你手动传入到Context中的字典键名不应该与处理器中传入的的键名一样,否则会在处理器中被覆盖掉。

并且,RequestContext总是使用  django.core.context_processors.csrf这个处理器,是生成一个安全的令牌(token),防止CSRF攻击。

你自定义的ContextProcessor是作为第三个参数传入给RequestContext,如(例子来自官方文档)

def ip_address_processor(request):
    return {'ip_address': request.META['REMOTE_ADDR']}
def some_view(request):
    # ...
    c = RequestContext(request, {
        'foo': 'bar',
    }, [ip_address_processor])
    return HttpResponse(t.render(c))


上述自定义的处理器添加了一个客户端地址,然后RequestContext就包含了

ip_address:xxxxxxxx这样的字典结构,当然,是从request拿的,这就是为什么RequestContext结构要接受request参数的原因了,因为后续的ContextProcessor也会根据本身的功能充request充拿出键值对,添加到Context结构,反馈给模板。

例如:django.contrib.auth.context_processors.auth会加添两个键值对给Context

user,一个auth.User的实例,代表当前登录的用户,若没有登录,为一个 AnonymousUser,一个匿名用户实例

django.contrib.auth.context_processors.request能使得我们可以在模板中可以直接使用request对象


编写自己的ContextProcessor很简单了,是一个函数,接受一个request,并且返回一个字典。这个字典是用来插入Context结构的

你可以自己导入,或者在TEMPLATE_CONTEXT_PROCESSORS中添加,注意,TEMPLATE_CONTEXT_PROCESSORS是顺序加载的



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值